[关闭]
@lychee123 2017-07-12T01:38:52.000000Z 字数 807 阅读 1053

UVA 3026:Period (KMP求周期串)


数据结构

题面链接

给你一个长度为 n 的字符串 s,判断这个字符串的周期串长度(大于1的周期串),并输出之间存在多少个周期
(2 ≤ N ≤ 1000000)

Sample Input
3 //字符串长度
aaa //这个串
12
aabaabaabaab
0

Sample Output
Test case #1
2 2
3 3
Test case #2
2 2
6 2
9 3
12 4

对字符串进行next数组的处理
字符串下标从0开始
循环字符串 当 (i+1)%(i-next[i])==0时表示从0到i位置是一个周期串
周期串个数 num=(i+1)/(i-Next[i]);

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn=1e6+6;
  6. int Next[maxn];
  7. void getnext(char s[])//next数组的处理
  8. {
  9. int l=strlen(s);
  10. Next[0]=-1;
  11. int j=-1;
  12. for(int i=1;i<l;i++)
  13. {
  14. while(j>=0&&s[j+1]!=s[i])
  15. j=Next[j];
  16. if(s[j+1]==s[i])
  17. j++;
  18. Next[i]=j;
  19. }
  20. }
  21. char s[maxn];
  22. int main()
  23. {
  24. int n,i,num,t=0;
  25. while(scanf("%d",&n)&&n!=0)
  26. {
  27. memset(Next,0,sizeof(Next));
  28. scanf("%s",s);
  29. getnext(s);
  30. printf("Test case #%d\n",++t);
  31. for(i=1;i<n;i++)
  32. {
  33. if((i+1)%(i-Next[i])==0&&Next[i]!=-1)
  34. {
  35. num=(i+1)/(i-Next[i]);
  36. printf("%d %d\n",i+1,num);
  37. }
  38. }
  39. puts("");
  40. }
  41. return 0;
  42. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注