Match:Power Strings(POJ 2406)

                

                字符串前缀的阶

  题目大意:求前缀的阶

  和POJ1961是一样的,KMP的Next数组的应用,不要用STL,不要一个一个读入字符(IO永远是最慢的)

  

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <functional>
 4 #include <string.h>
 5 
 6 using namespace std;
 7 
 8 static char Text[1000002];
 9 static int _Next[1000002];
10 
11 void Input(int &);
12 void Get_Next(const int);
13 
14 int main(void)
15 {
16     int Length, k_count, if_res;
17     while (1)
18     {
19         Input(Length);
20         if (*Text == '.')//小数点结束
21             break;
22         Get_Next(Length);
23         if_res = Length % (Length - _Next[Length]);
24         k_count = Length / (Length - _Next[Length]);
25         if (if_res == 0 && k_count > 1)
26             printf("%d\n", k_count);
27         else printf("1\n");
28     }
29     return EXIT_SUCCESS;
30 }
31 
32 void Input(int &Length)
33 {
34     Length = 0;
35     scanf("%s", Text);
36     Length = strlen(Text);
37 }
38 
39 void Get_Next(const int Length)
40 {
41     int i = 0, k = -1;
42     _Next[0] = -1;
43 
44     while (i < Length)
45     {
46         if (k == -1 || Text[i] == Text[k])
47         {
48             i++;
49             k++;
50             _Next[i] = k;
51         }
52         else k = _Next[k];
53     }
54 }

  

  另外以这一题有散列做法,但是没有kmp那么快,但是用到了一个非常好的算法——矩阵快速幂,以后补

你可能感兴趣的:(Match:Power Strings(POJ 2406))