码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2406 KMP算法

时间:2014-09-04 22:07:21      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   ar   for   div   

POJ2406

问题重述:给定字符串s0,记连续的k个s前后相连组成的s0s0...s0为s0^k。输入字符串S,求最大的k,使得S = s0^k.

问题分析:

1.采用kmp算法求出前缀函数 prefix[i] (i = 1,2,... n, n = length(S)).

2.假如n - prefix[n]能够整除n, 则S能表示为k = n / (n - prefix[n])个连续s0,且k此时取到最大值

3.否则, S不能表示为连续的s0的形式, k = 1。

AC代码:

 1 //Memory: 5680K        Time: 313MS
 2 #include <iostream>
 3 #include <cstring>
 4 #include <string>
 5 
 6 using namespace std;
 7 
 8 const int maxn = 1000010;
 9 
10 int prefix[maxn];
11 string s;
12 
13 void init()
14 {
15     int l = s.size();
16     memset(prefix, 0, sizeof(prefix));
17     int k = 0;
18     for (int i = 2; i <= l; i++) {
19         while (k > 0 && s[k] != s[i - 1])
20             k = prefix[k];
21         if (s[k] == s[i - 1])
22             k++;
23         prefix[i] = k;
24     }
25 }
26 
27 int main()
28 {
29     while (cin >> s && s != ".") {
30         init();
31         int l = s.size();
32         
33         if ( prefix[l] != 0 && l % (l - prefix[l]) == 0) 
34             cout << l / (l - prefix[l]) << endl;
35         else
36             cout << "1" << endl;
37     }
38     return 0;
39 }

 

POJ2406 KMP算法

标签:style   blog   http   color   os   io   ar   for   div   

原文地址:http://www.cnblogs.com/junxie/p/3956888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!