POJ 1261 Period KMP (字串週期)
題目:·
Description
For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the
largest K > 1 (if there is one) such that the prefix of S with length i can be written as A K , that is A concatenated K times, for some string A. Of course, we also want to know the period K.
Input
The input file consists of several test cases. Each test case consists of two lines. The first one contains N (2 <= N <= 1 000 000) – the size of the string S. The second line contains the string S. The input file ends with a line, having the number zero on
it.
Output
For each test case, output “Test case #” and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing
order. Print a blank line after each test case.
Sample Input
3 aaa 12 aabaabaabaab 0
Sample Output
Test case #1 2 2 3 3 Test case #2 2 2 6 2 9 3 12 4
程式碼:
#include<iostream>
#include<string.h>
using namespace std;
char c[1000005];
int next_[1000005];
void get_next(char *t, int m, int next[])
{
int i = 1, j = 0;
next[1] = 0;
while (i < m)
{
if (j == 0 || t[i] == t[j])next[++i] = ++j;
else j = next[j];
}
}
int main()
{
ios_base::sync_with_stdio(false);
int n;
int casei = 0;
int dif;
while (1)
{
cin >> n;
casei++;
if (n == 0)break;
for (int i = 1; i <= n; i++)cin >> c[i];
get_next(c, n, next_);
cout << "Test case #" << casei << endl;
for (int i = 2; i <= n; i++)
{
if (c[i] == c[next_[i]])
{
dif = i - next_[i];
if (i%dif == 0)cout << i <<" "<< i / dif << endl;
}
}
cout << endl;
}
return 0;
}
相關文章
- POJ--2406Power Strings+KMP求字串最小週期KMP字串
- POJ-1961 Period-KMP字首串重複次數KMP
- POJ 3461 kmpKMP
- DreamJudge-1261-字串排序3字串排序
- 【字串匹配】KMP字串匹配KMP
- 【Kmp】Blue Jeans POJ - 3080KMP
- 演算法篇-字串-週期串演算法字串
- 第三週下 kmpKMP
- KMP Algorithm 字串匹配演算法KMP小結KMPGo字串匹配演算法
- KMP字串模式匹配詳解KMP字串模式
- 【模板】【字串】KMP演算法字串KMP演算法
- Delphi字串的引用計數與生命週期字串
- POJ 3981 字串替換字串
- KMP字串匹配學習筆記KMP字串匹配筆記
- 字串匹配演算法:KMP字串匹配演算法KMP
- KMP字串匹配演算法KMP字串匹配演算法
- 字串匹配KMP演算法初探字串匹配KMP演算法
- 取週期性字串中的其中一個字串
- 時鐘週期,機器週期,指令週期
- Poj--3080Blue Jeans+KMP水題KMP
- POJ3461-KMP演算法的簡單運用KMP演算法
- POJ2752--KMP求所有可能的相同字首字尾KMP
- 字串學習總結(Hash & Manacher & KMP)字串KMP
- 字串匹配之KMP《演算法很美》字串匹配KMP演算法
- 字串匹配問題——KMP演算法字串匹配KMP演算法
- KPM演算法求字串的最小週期證明演算法字串
- POJ 3080 Blue Jeans (KMP+暴力列舉)【模板】KMP
- kmp字串匹配,A星尋路演算法KMP字串匹配演算法
- 字串匹配基礎下——KMP 演算法字串匹配KMP演算法
- 字串演算法--$\mathcal{KMP,Trie}$樹字串演算法KMP
- 【KMP求字串匹配次數】 hdu 1686KMP字串匹配
- HDU 4668 Finding string (解析字串 + KMP)字串KMP
- KMP字串匹配演算法 通俗理解KMP字串匹配演算法
- 第五章 字串專題 ---------------- 字串匹配(二)----KMP演算法字串匹配KMP演算法
- 快速字串匹配一: 看毛片演算法(KMP)字串匹配演算法KMP
- 匹配字串之——KMP演算法深入理解字串KMP演算法
- KMP字串匹配演算法理解(轉)KMP字串匹配演算法
- POJ-3461 Oulipo-匹配的字元有幾個(KMP演算法)字元KMP演算法