KMP

KMP详解
例题
题意:求解 出现次数>= n 的前缀。

emmmmmmmmmm,思路正确,就是 细节问题,把自己搞晕了

#include
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;i0&&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"<

你可能感兴趣的:(KMP)