题意
求字符串所有循环节的长度
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 400050;
char p[maxn];
int fail[maxn];
vector<int> ans;
void getFail()
{
int len = strlen(p);
fail[0] = fail[1] = 0;
for(int i = 1; i < len; i++)
{
int j = fail[i];
while(j && p[j] != p[i]) j = fail[j];
if(p[j] == p[i]) fail[i+1] = j + 1;
else fail[i+1] = 0;
}
}
int main()
{
while(scanf("%s",p) != EOF)
{
getFail();
ans.clear();
int j = strlen(p);
while(j > 0)
{
ans.push_back(j);
j = fail[j];
}
printf("%d" ,ans[ans.size()-1]);
for(int i = ans.size()-2;i>=0;i--)
{
printf(" %d",ans[i]);
}
printf("\n");
}
return 0;
}