2406 Power Strings

来源:互联网 发布:软件测试如何学以致用 编辑:程序博客网 时间:2024/06/11 01:34

kmp 的入门题~

此题考察的对next[]数组的理解,明白了next[]数组的含义自然迎刃而解,但是题中有些容易错的地方

会代码中指出

例如 abababa这个例子

#include"iostream"#include"string.h"using namespace std;int next[1000005];char str[1000005];int len;void get_next(){     int i=0,j=-1;     next[0]=-1;     while(i<len)     {         if(j==-1||str[i]==str[j])         {             ++i;++j;next[i]=j;         }         else            j=next[j];     }}int main(){    while(cin>>str&&strcmp(str,"."))    {        len=strlen(str);        get_next();        if(next[len]==0)//这个地方最容易错,考虑考虑abababa这个例子            cout<<1<<endl;        else            if(len%(len-next[len])==0)//核心部分                cout<<len/(len-next[len])<<endl;            else                cout<<1<<endl;    }    return 0;}
这个方程是怎么来的,其实就是next数组自匹配的一个理解

比如ababab

其next数组为 -1 0 01 2 3 4

我们看最后这个 next[6]==4这个数据

其意思是最前面的abab  与后面的abab相同

所以用len-next[len]是求出最小重复单元,就是ababab最中间的ab去掉~得到的ab就是最小单元



原创粉丝点击