emmmmmmmmmm,思路正确,就是 细节问题,把自己搞晕了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 100010
int num[N];
int co[N];
int nex[N];
char a[N];char b[N];
void makeNext()
{
int q,k;//q:模版字符串下标;k:最大前后缀长度
int m = strlen(b);//模版字符串长度
nex[0] = 0;//模版字符串的第一个字符的最大前后缀长度为0
for (q = 1,k = 0; q < m; ++q)//for循环,从第二个字符开始,依次计算每一个字符对应的next值
{
while(k > 0 && b[q] != b[k])//递归的求出P[0]···P[q]的最大的相同的前后缀长度k
k = nex[k-1]; //不理解没关系看下面的分析,这个while循环是整段代码的精髓所在,确实不好理解
if (b[q] == b[k])//如果相等,那么最大相同前后缀长度加1
{
k++;
}
nex[q] = k;
}
}
int main()
{
gets(a);gets(b);
int cn=0;
makeNext();
int n;
cin>>n;
int st=0;
int r=strlen(b);int l=strlen(a);
for(int i=0;i<l;i++)
{
while(st>0&&a[i]!=b[st])
st=nex[st-1];
if(a[i]==b[st])
{
st++;
}
co[st]++;
if(st==r)
st=nex[st-1];
}
for(int i=r;i>0;i--)
{
co[nex[i-1]]+=co[i];
}
for(int i=strlen(b);i>=1;i--)
{
if(co[i]>=n)
{
b[i]='\0';
printf("%s\n",b);
return 0;
}
}
cout<<"IMPOSSIBLE"<<endl;
return 0;
}