题目链接:http://poj.org/problem?id=2752
题意:给一个字符串,判断前缀和后缀是相同的位置,把这些位置从小到大输出出来。
题解:通过字符串得到next数组,然后从next[len]开始。其值就是最后一个是相同前缀后缀的位置,然后,i=next[i],就是不断的向前找,就匹配了过去。
代码如下:
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<string> 6 using namespace std; 7 const int maxn=1000005; 8 int Next[maxn]; 9 char s[maxn]; 10 int sum[maxn]; 11 void getNext(int len) 12 { 13 int i=0,j=-1; 14 Next[0]=-1; 15 while(i<len) 16 { 17 if(j==-1||s[i]==s[j]) 18 { 19 i++; 20 j++; 21 Next[i]=j; 22 } 23 else 24 j=Next[j]; 25 } 26 } 27 int main() 28 { 29 int t; 30 int temp=1; 31 while(~scanf("%s",s)) 32 { 33 int l=strlen(s); 34 getNext(l); 35 int k=l-Next[l]; 36 temp=1; 37 38 for(int i=l;i>=1;) 39 { 40 sum[temp++]=Next[i]; 41 i=Next[i]; 42 } 43 for(int i=temp-1;i>=1;i--) 44 if(sum[i]) 45 printf("%d ",sum[i]); 46 printf("%d\n",l); 47 } 48 }
时间: 2024-12-28 23:44:07