题目大意
给出一个字符串,输出所有既是前缀又是后缀的子串的长度。
思路
又是一道考验对KMP的next[]数组理解的题。如果清楚next[]数组的含义,那么这道题也没什么好说的了。
代码
#include<iostream> #include<stdio.h> using namespace std; #define P_SIZE 1000000 int next[P_SIZE+2],res[P_SIZE]; char P[P_SIZE+2]; //P是模式串。 void COMPUTE_PREFIX_FUNCTION(char P[]) //对next[]进行赋值。 { int m=strlen(P+1); next[1]=0; for(int k=0,q=2;q<=m;q++) { while(k>0&&P[k+1]!=P[q]) k=next[k]; if(P[k+1]==P[q]) k++; next[q]=k; } } int main() { while(~scanf("%s",P+1)) { COMPUTE_PREFIX_FUNCTION(P); int total=0,len=strlen(P+1); res[total++]=len; for(int i=len;next[i]!=0;i=next[i]) res[total++]=next[i]; for(int i=total-1;i>=0;i--) printf("%d%c",res[i],i?' ':'\n'); } }
后记
输入那里忘记了加上“~”,导致OLE,找了好久才发现这个bug。