zoukankan      html  css  js  c++  java
  • KMP + 求最小循环节 --- HDU 1358 Period

    Period 

    Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=1358


     

    Mean: 

    给你一个字符串,让你从第二个字符开始判断当前长度的字符串是否是重复串,如果是,输出当前位置,并输出重复串的周期。

    analyse:

    还是next数组的运用,详见上一篇博客。

    Time complexity: O(N)

     

    Source code: 

    /*
    * this code is made by crazyacking
    * Verdict: Accepted
    * Submission Date: 2015-07-28-07.12
    * Time: 0MS
    * Memory: 137KB
    */
    #include <queue>
    #include <cstdio>
    #include <set>
    #include <string>
    #include <stack>
    #include <cmath>
    #include <climits>
    #include <map>
    #include <cstdlib>
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <cstring>
    #define  LL long long
    #define  ULL unsigned long long
    using namespace std;
    const int MAXN=1000010;
    int n;
    char s[MAXN];
    int Next[MAXN];
    void getNext()
    {
         Next[0]=0;
         for(int i=1,k=0;i<n;++i)
         {
               while(s[i]!=s[k]&&k) k=Next[k-1];
               if(s[i]==s[k]) ++k;
               Next[i]=k;
         }
    }
    int main()
    {
         ios_base::sync_with_stdio(false);
         cin.tie(0);
         int cas=1;
         while(~scanf("%d",&n)&&n)
         {
               scanf("%s",s);
               getNext();
               printf("Test case #%d ",cas++);
               for(int i=1;i<n;++i)
               {
                     int now_cycle=(i+1)-Next[i];
                     if((now_cycle!=i+1) && (i+1)%now_cycle==0)
                     {
                           printf("%d %d ",i+1,(i+1)/now_cycle);
                     }
               }
               puts("");
         }
         return 0;
    }
    /*

    */
  • 相关阅读:
    自建mail服务器之一:dns解析
    区间树
    3d tech
    3d
    平板比较
    Node。js 访问gmail
    node nightmare 网页自动化测试 sample
    node start
    中國駐香港外交部
    create a simple COM object
  • 原文地址:https://www.cnblogs.com/crazyacking/p/4681728.html
Copyright © 2011-2022 走看看