题解 UVA10298 【Power Strings】

这是一道KMP算法题。

首先GetNext,这是不用说的,GetNext可以说是每一道KMP都要做的。

接下来我们考虑如何求解。

我们不妨假设这个字符串长度为N,那么N-Next[N]这个位置一定是重复的那个最长子串最后一个字符所在的位置

那如果这整个字符串真的是由好几个相同字符串重复连接,那么
N mod (N-Next[N])=0
所以答案是
N/(N-Next[N])

#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;
}
View Code

 

posted @ 2020-08-08 14:24  Bushuai_Tang  阅读(91)  评论(0编辑  收藏  举报