zoukankan      html  css  js  c++  java
  • poj 2406 Power Strings

    https://vjudge.net/problem/POJ-2406

    题意:

    求一个字符串的最小循环节的循环次数。

    思路:

    参考了白书的213页的例题,如何求循环节的长度,用kmp算法所得到的失配函数进行求解。循环节的长度是i - f[i]。因此这题直接用len / (len-f[len]) 求解循环节的个数,wa了一次,是因为len % (len-f[len]) 必须得等于0才行,循环节的长度肯定是能够整除长度才行,比如ababa这个例子。

    代码:

     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <string>
     4 #include <string.h>
     5 using namespace std;
     6 
     7 string text;
     8 char a[1000005];
     9 int fl[1000005];
    10 
    11 void getfail(string p,int* f)
    12 {
    13     int m = p.size();
    14 
    15     f[0] = f[1] = 0;
    16 
    17     for (int i = 1;i < m;i++)
    18     {
    19         int j = f[i];
    20 
    21         while (j && p[i] != p[j]) j = f[j];
    22 
    23         f[i+1] = p[i] == p[j] ? j+1 : 0;
    24     }
    25 }
    26 
    27 int main()
    28 {
    29     while (scanf("%s",a) != EOF)
    30     {
    31         memset(fl,0,sizeof(fl));
    32 
    33         if (a[0] == '.') break;
    34 
    35         text = string(a);
    36 
    37         getfail(a,fl);
    38 
    39         int len = text.size();
    40 
    41         if (len % (len - fl[len]) == 0)
    42         {
    43             int ans = len / (len - fl[len]);
    44 
    45             printf("%d
    ",ans);
    46         }
    47         else
    48             printf("1
    ");
    49 
    50 
    51     }
    52 
    53     return 0;
    54 }
  • 相关阅读:
    SQL学习指南第三篇
    SQL学习指南第二篇
    Rebuilding Roads
    TOJ4244: Sum
    K-th Number
    【模板】后缀数组
    冰水挑战
    旅途
    Monkey and Banana
    Max Sum Plus Plus
  • 原文地址:https://www.cnblogs.com/kickit/p/7253047.html
Copyright © 2011-2022 走看看