题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1358
题目大意: 给定一个字符串,求每个对应位置是否存在前缀重复串,如果存在输出位置及重复次数。
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int nextt[1000100]; void getnext(char *s){ //kmp算法的next数组 int len=strlen(s); int i=0,j=-1; nextt[0]=-1; while(i<len){ if(s[i]==s[j]||j==-1){ //判断是核心 nextt[++i]=++j; if(i%(i-j)==0&&i/(i-j)>1){ //注意这里i和j已经自加完成。由于kmp中next数组每个位置存的是上一个位置及之前的最大前后缀相同字母数,因此自加完成后指的就是当前位置,对这里的ij进行判断自然是正确的。 printf("%d %d\n",i,i/(i-j)); } } else j=nextt[j]; } } int main(){ char str[1000100]; int cnt=1; int n; while(scanf("%d",&n)!=EOF&&n){ memset(nextt,0,sizeof(nextt)); scanf("%s",str); printf("Test case #%d\n",cnt++); getnext(str); printf("\n"); //认真读题,避免presentation error } return 0; }如果题做不出来就找找样例的规律~