zoukankan      html  css  js  c++  java
  • poj2406 Power Strings(kmp失配函数)

                                          Power Strings

    Time Limit: 3000MS

     

    Memory Limit: 65536K

    Total Submissions: 39291

     

    Accepted: 16315

    Description

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).

    Input

    Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.

    Output

    For each s you should print the largest n such that s = a^n for some string a.

    Sample Input

    abcd

    aaaa

    ababab

    .

    Sample Output

    1

    4

    3

    Hint

    This problem has huge input, use scanf instead of cin to avoid time limit exceed.

    Source

    Waterloo local 2002.07.01

    【思路】

           KMP。

           应用KMP算法中的失配函数,如果是一个周期串那么错位部分(n-f[n])一定是一个最小循环节(仔细想想f函数的意义),则答案为i/(n-f[n])。否则ans=1。

       时间复杂度为O(n)。

    【代码】

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
     5 using namespace std;
     6 
     7 const int maxn = 1000000+10;
     8 
     9 void getFail(char* P,int* f) {
    10     int m=strlen(P);
    11     f[0]=f[1]=0;
    12     for(int i=1;i<m;i++) {
    13         int j=f[i];
    14         while(j && P[i]!=P[j]) j=f[j];
    15         f[i+1]=P[i]==P[j]?j+1:0;
    16     }
    17 }
    18 
    19 char s[maxn];
    20 int f[maxn];
    21 
    22 int main() {
    23     while(scanf("%s",s)==1 && s[0]!='.') {
    24         getFail(s,f);
    25         int n=strlen(s);
    26         if(f[n]>0 && n%(n-f[n])==0) printf("%d
    ",n/(n-f[n]));
    27         else printf("%d
    ",1);
    28     }
    29     return 0;
    30 }
  • 相关阅读:
    ztree学习---将默认勾选的展开
    CentOS之RPM
    CentOS之文档的压缩与打包
    CentOS之Vim
    CentOS用户和用户组管理
    Linux CentOS更改文件的权限
    CentOS的文件属性:命令 ls -l
    CentOS命令
    Java解析excel
    easyUI的combotree的树的懒加载。
  • 原文地址:https://www.cnblogs.com/lidaxin/p/5003058.html
Copyright © 2011-2022 走看看