POJ 2752

来源:互联网 发布:vb和c语言哪个难 编辑:程序博客网 时间:2024/05/22 17:26
#include<iostream>using namespace std;const int MAX=400005;char s[MAX];int tmp[MAX];int len[MAX];char substr[MAX];void GetNext(char* p,int next[])  {      int pLen = strlen(p);      next[0] = -1;      int k = -1;      int j = 0;      while (j < pLen)      {          //p[k]表示前缀,p[j]表示后缀          if (k == -1 || p[j] == p[k])           {              ++k;              ++j;              next[j] = k;          }          else           {              k = next[k];          }      }  }  int main(){  while(scanf("%s",s)!=EOF){int count=0;GetNext(s,tmp);int sLen=strlen(s);int n=sLen;while(tmp[n]!=0){n=tmp[n];len[count]=n;count++;}for(int i=0;i<count;i++)printf("%d ",len[count-i-1]);printf("%d\n",sLen);//整个字符是符合前缀后缀}}


思路如下:

k=next[i]:表示 p[0..i-1]的最长后缀前缀是k,即p[0..k-1].

所以,对字符串S计算出其next数组,GetNext(s,tmp);

int sLen=strlen(s);

从next[sLen]开始算起,即k=next[sLen],表示

p[0..sLen-1]的前缀后缀长度是k.

然后继续迭代

k=next[k];

因为比如说s="abc",那么"abc"会是s的前缀后缀,所以

printf("%d\n",sLen);//整个字符是符合前缀后缀




0 0
原创粉丝点击