题解 UVA10298 【Power Strings】
这是一道KMP算法题。
首先GetNext,这是不用说的,GetNext可以说是每一道KMP都要做的。
接下来我们考虑如何求解。
我们不妨假设这个字符串长度为N,那么N-Next[N]这个位置一定是重复的那个最长子串最后一个字符所在的位置
那如果这整个字符串真的是由好几个相同字符串重复连接,那么
N mod (N-Next[N])=0
所以答案是
N/(N-Next[N])
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; string S; int L; int Next[1000001]; inline void GetNext() { register int i,j; i=0; j=-1; Next[0]=-1; while(i<L) { if(j==-1||S[i]==S[j]) { Next[++i]=++j; } else { j=Next[j]; } } } int main(void) { while(cin>>S) { if(S==".") { return 0; } L=S.size(); GetNext(); if(L%(L-Next[L])==0) { cout<<L/(L-Next[L])<<endl; } else { cout<<1<<endl; } } return 0; }
不要妄图追上西坠的太阳,而是要在黎明前就等着它!