POJ 2406 Power Strings (KMP) kmp循环节

来源:互联网 发布:直销结算软件 编辑:程序博客网 时间:2024/05/21 07:56
Power Strings
Time Limit: 3000MS Memory Limit: 65536KTotal Submissions: 24403 Accepted: 10264

Description

给你一个字符串a,问a最多由几个完全相同的子串连接而成

Input

每一个测试点都会给你一个长度为m(1<=m<=1000000)的字符串,并以句号结尾。

Output

输出a最多由几个完全相同的子串连接而成。

Sample Input

abcdaaaaababab.

Sample Output

143

Hint

用cin会超时

next[j]的值代表当前的模式串 j位置之前的字符 最大的相同的前缀后缀,
也意味着当前缀后缀不匹配时 模式串j位置要和模式串next[j]位置的字符来匹配,则模式串第1位到next[j]与模式串第j-next[j]位到j位是匹配的。更意味着前缀后缀匹配失败时
模式串要向后移动j-next[j]个位置,这个题就是考察的j-next[j]是不是j的倍数
当存在长度为n的字符串要是由长度为m的循环节组成那么循环节的个数一定是n/m,而现在循环判断到模式串最后一个字符n-1(因为数组下标用的是从0开始)位置时,(循环体内会得到数组next[n]的值),那么n-next[n]就是要移动的长度(也是循环节所包含的字符个数,要是n%(n-next[n])=0就是所含的个数,/////?否则就为1*/

例如:a    b    a    b    a    b

next:-1   0    0    1    2    3    4


代码懒得打了
#include<iostream>#include <stdio.h>#include<string.h>using namespace std;int next[1000005];char s[1000005];void getnext(){    int i=0,j=-1;    next[0]=-1;    int len=strlen(s);    while(i<len)//不同点    {        if(s[i]==s[j]||j==-1)        {            i++;            j++;            next[i]=j;        }        else            j=next[j];    }}int main(){    while(scanf("%s",s)>0)    {        if(s[0]=='.')            break;        int len=strlen(s);        getnext();        if(len%(len-next[len])==0)            printf("%d\n",len/(len-next[len]));        else//?            printf("1\n");//?    }    return 0;}
http://www.cnblogs.com/ziyi--caolu/archive/2013/01/01/2841708.html
原创粉丝点击