题目大意
给定一个字符串S,求出所有既是S的前缀又是S的后缀的子串长度
题解
从末尾位置倒推,经过的失配函数值就是题目要求求的
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; #define MAXN 400005 int f[MAXN]; char p[MAXN]; int main() { int j; while(scanf("%s",p)!=EOF) { vector<int> ivec; int len=strlen(p); f[0]=j=-1; for(int i=1;i<len;i++) { while(j>=0&&p[j+1]!=p[i]) j=f[j]; if(p[j+1]==p[i]) j++; f[i]=j; } j=len-1; ivec.push_back(len); while(f[j]>=0) { ivec.push_back(f[j]+1); j=f[j]; } for(int i=ivec.size()-1;i>=0;i--) printf("%d ",ivec[i]); printf(" "); } return 0; }