HDU 1358(kmp)

叁歲伎倆 2022-09-20 12:44 124阅读 0赞

题意:给出一个数字n,接下来一行是一个字符串,n是这个字符串的长度。求这个字符串的所有是循环字符串的前缀。

kmp中的next数组只得是第i个字符匹配错误,向前跳的位置next【i】。

  1. #include<algorithm>
  2. #include<stdio.h>
  3. #include<string>
  4. #include<string.h>
  5. #include<math.h>
  6. #include<queue>
  7. #include<iostream>
  8. using namespace std;
  9. int i,j,k;
  10. int len;
  11. char s[1000001];
  12. int next[1000001];
  13. void get_next()
  14. {
  15. int i=0,j=-1;
  16. next[0]=-1;
  17. for(;s[i];)
  18. if(j==-1||s[i]==s[j])
  19. {
  20. ++i;++j;
  21. next[i]=j;
  22. }
  23. else j=next[j];
  24. }
  25. int main(){
  26. int t=1;
  27. while(scanf("%d",&len)&&len){
  28. getchar();
  29. scanf("%s",s);
  30. get_next();
  31. printf("Test case #%d\n",t++);
  32. for(i=2;i<=len;i++){
  33. j=i-next[i];
  34. if(i%j==0){
  35. if(i/j>1) printf("%d %d\n",i,i/j);
  36. }
  37. }
  38. printf("\n");
  39. }
  40. return 0;
  41. }

发表评论

表情:
评论列表 (有 0 条评论,124人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU 1358(kmp)

    题意:给出一个数字n,接下来一行是一个字符串,n是这个字符串的长度。求这个字符串的所有是循环字符串的前缀。 kmp中的next数组只得是第i个字符匹配错误,向前跳的位置nex