洛谷UVA1328,POJ1961-Period【KMP,字符串】

正题

洛谷评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=UVA1328
POJ链接:http://poj.org/problem?id=1961


题目大意

求一个字符串每个前缀的最短循环循环次数。


解题思路

计算next数组,然后直接计算循环节:
详见:POJ2752-Seek the Name, Seek the Fame【KMP】


code

#include<cstdio>
using namespace std;
int n,fail[1000001],k;
char s[1000001];
int main()
{
    while(true)
    {
      ++k;
      scanf("%d",&n);
      if(n==0) return 0;
      scanf("%s",s);
      for(int i=1,j=0;i<n;i++)
      {
          while(j&&s[i]!=s[j])j=fail[j];
          j+=(s[i]==s[j]);
          fail[i+1]=j;
      }//构建失败指针
      printf("Test case #%d\n",k);
      for(int i=2;i<=n;i++)
      {
          if(i/(i-fail[i])>1&&!(i%(i-fail[i]))) printf("%d %d\n",i,i/(i-fail[i]));
          //输出答案
      }
      printf("\n");
    }
}

猜你喜欢

转载自blog.csdn.net/Mr_wuyongcong/article/details/81782445
今日推荐