标准kmp+二分
2025-07-13 20:43:50
发布于:广东
1阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char s[N],p[N];
int ne[N],n;   //next[i]表示子串p前i个字符的前缀等于后缀的最长长度
bool check(int lenp){
int lens=strlen(s+1);
//将p的最后字符的后一个设置为非小写英文,使得p的长度变为lenp 
char temp=p[lenp+1];
p[lenp+1]=0;
//标准kmp 
//获取next 
ne[0]=0;ne[1]=0;
for(int i=1,j=0;i<lenp;i++){
	while(j&&p[i+1]!=p[j+1]) j=ne[j];
	if(p[i+1]==p[j+1]) j++;
	ne[i+1]=j;
}
int cnt=0;//计数 
//匹配 
for(int i=0,j=0;i<lens;i++){
	while(j&&p[j+1]!=s[i+1]) j=ne[j];
	if(p[j+1]==s[i+1]) j++;
	if(j==lenp){
		cnt++;
	}
}
//还原p 
p[lenp+1]=temp;
//判断 
if(cnt>=n) return true;
else return false;
}
int main(){
//输入
scanf("%s%s",s+1,p+1);
cin>>n;
int lenp=strlen(p+1);
//二分前的准备 
int l=1,r=lenp,mid;
bool f=false;
//二分答案 
while(l<=r){
	mid=l+r>>1;
	if(check(mid)){
		l=mid+1;
		f=true;
	}else{
		r=mid-1;
	}
}
//判断 
if(f)
	for(int i=1;i<=r;i++){
		cout<<p[i];
	}
else
	cout<<"IMPOSSIBLE"<<endl;
return 0;
}
这里空空如也

有帮助,赞一个