题目:
俗话说“好命不如好名”,小h准备给他的宠物狗起个新的名字,于是他把一些英文的名字全抄下来了,写成一行长长的字符串,小h觉得一个名字如果是好名字,那么这个名字在这个串中既是前缀,又是后缀,即是这个名字从前面开始可以匹配,从后面开始也可以匹配,例如abc在 abcddabc中既是前缀,也是后缀,而ab就不是,可是长达4*10^5的字符让小h几乎昏过去了,为了给自己的小狗起个好名字,小h向你求救,并且他要求要将所有的好名字的长度都输出来。
输入:
一行,要处理的字符串(都是小写字母)
输出:
一行若干个数字,从小到大输出,表示好名字的长度
样例:
abcddabc
3 8
KMP
求出KMP中的next数组,在求一下next[strlen(s)-1]的方案
#include<cstdio> #include<cstring> using namespace std; char b[500010]; int n,m,a[500010],f[500010],cnt=0; int main() { scanf("%s",&b); n=strlen(b); f[0]=-1; int j=-1; for (int i=1;i<=n;i++) { j=f[i-1]; while (b[j+1]!=b[i]&&j!=-1) j=f[j]; if (b[j+1]==b[i]) f[i]=j+1; else f[i]=-1; } j=f[n-1]; while (j>=0) { if (b[j]==b[n-1]) a[++cnt]=j+1; j=f[j]; } for (int i=cnt;i>=1;i--) printf("%d ",a[i]); printf("%d ",n); }