如有错误,请留言提醒,不要坑到小朋友
Description
给定一个字符串,要求找到同时是它前缀也是后缀的字符串的个数,并且输出他们的长度。
Input
输入一个字符串,长度<= 10^6.
Output
输出这些子串的结束位置(因为它们的开始位置都是从1开始的)
Sample Input
【样例输入1】
ababcababababcabab
【样例输入2】
aaaaa
Sample Output
【样例输出1】
2 4 9 18
【样例输出2】
1 2 3 4 5
kmp裸题,不多说了
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> int n,pre[1000000],answer[1000000]; char ss[1000000]; int main() { scanf("%d",&n); scanf("%s",ss); int i,j=0; pre[1]=0; for(i=2;i<=n;i++){ while(j>0&&ss[j]!=ss[i-1]) j=pre[j]; if(ss[j]==ss[i-1])j++; pre[i]=j; } j=n; int w=0; while(j>0){ w++; answer[w]=j; j=pre[j]; } for(i=w;i>1;i--) printf("%d ",answer[i]); printf("%d\n",answer[1]); }