POJ 2406-Power Strings(重複子串-KMP中的next陣列)
Power Strings
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 47642 | Accepted: 19867 |
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
題目意思:
一個字串由K個迴圈節組成,求迴圈節最小的時候其字元的個數L。
解題思路:
暴力又又TLE了,然後,發現要利用next陣列的特性:模式串長度為n,其第1位到next[n]與模式串第n-next[n]位到n位是匹配的。
根據定義,next[i]表示模式串0~i-1長度中,字尾與字首的最長匹配子串的長度,所以next[n]表示整個模式串字尾與字首的最長匹配子串的長度,
next[KL] = (K-1)L,即next[n] = n - L,所以L = n-next[n],所以n-next[n]表示一個最小迴圈節的長度。
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<map>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define INF 0xfffffff
#define MAXN 1000010
char t[MAXN];
int next[MAXN];
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("G:/cbx/read.txt","r",stdin);
//freopen("G:/cbx/out.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>t)
{
if(t[0]=='.') break;
memset(next,0,sizeof(next));
int len=strlen(t);
int ans=1;
int p=0,cur;
next[0]=-1;
next[1]=0;
for(cur=2; cur<=len; ++cur)//求next陣列
{
while(p>=0&&t[p]!=t[cur-1])
p=next[p];
next[cur]=++p;
}
if(len%(len-next[len])==0)//模式串第1位到next[n]與模式串第n-next[n]位到n位是匹配的
ans=len/(len-next[len]);
cout<<ans<<endl;
}
return 0;
}
相關文章
- POJ 3693 Maximum repetition substring(字尾陣列求最長重複子串)陣列
- poj3080-kmp+列舉子串 求最長公共子串KMP
- POJ 1743 Musical Theme (字尾陣列,求最長不重疊重複子串)陣列
- POJ-1961 Period-KMP字首串重複次數KMP
- KMP演算法的next、next value陣列程式碼實現及POJ3461KMP演算法陣列
- POJ 3294 Life Forms(字尾陣列求k個串的最長子串)ORM陣列
- SPOJ 687. Repeats(字尾陣列求最長重複子串)陣列
- KMP演算法中關於next陣列的探究KMP演算法陣列
- 關於 KMP next 陣列的應用KMP陣列
- POJ 2752+KMP+利用next陣列性質求出所有相同的字首和字尾KMP陣列
- POJ 2217-Secretary(字尾陣列+高度陣列-最大公共子串長度)陣列
- poj 2774 求兩字串的最長公共子串 字尾陣列字串陣列
- KMP演算法的Next陣列詳解KMP演算法陣列
- 陣列中重複的數字陣列
- java陣列中重複元素的去重Java陣列
- KMP演算法中我對獲取next陣列的理解KMP演算法陣列
- 求字串中不含重複字元的最長子串字串字元
- 【Kmp求既是字首又是字尾的子串】POJ - 2752 Seek the Name, Seek the FameKMP
- KMP演算法的next、next value陣列的手工計算KMP演算法陣列
- KMP演算法next陣列的深入理解KMP演算法陣列
- 無重複字元的最長子串字元
- javascript去掉陣列中重複的值JavaScript陣列
- POJ 2774-Long Long Message(字尾陣列+高度陣列-最大公共子串長度)陣列
- java無重複字元的最長子串Java字元
- 3 無重複字元的最長子串字元
- js 去掉陣列物件中的重複物件JS陣列物件
- 刪除排序陣列中的重複項排序陣列
- js刪除陣列中重複的元素JS陣列
- js刪除陣列中的重複元素JS陣列
- 如何去除有序陣列中的重複元素陣列
- 一句程式碼搞定陣列去重(去除陣列中的重複元素)陣列
- KMP演算法以及優化(程式碼分析以及求解next陣列和nextval陣列)KMP演算法優化陣列
- POJ 3415 Common Substrings(字尾陣列求重複字串)陣列字串
- 3. 無重複字元的最長子串字元
- 計蒜客 移除陣列中的重複元素陣列
- JZ-050-陣列中重複的數字陣列
- js如何刪除陣列中重複的值JS陣列
- 刪除排序陣列中的重複數字排序陣列