POJ 2185 KMP (最小循环模块)

来源:互联网 发布:手机淘宝怎么上咸鱼 编辑:程序博客网 时间:2024/05/19 23:13
/*题意:求最小循环模块的面积必然存在一个最小循环模块的起点为(0,0),对于每一行,对每一个循环串的长度做记录,满足所有行条件的最短长度即为宽b对于长度,颗粒利用strcmp把每一行的字符串看成一个字符,然后进行KMP就可以得到长度*/#include <cstdio>#include <cstring>#include <iostream>using namespace std;char s[10005][105];int cnt[10005],next[10005],h,w;void getnext(int c){    int i=0,j=-1;    next[0]=-1;    while(i<w)    {        if(j==-1||s[c][i]==s[c][j])        {            i++;            j++;            next[i]=j;        }        else            j=next[j];    }}void kmp(int b){    int i=0,j=-1;    next[0]=-1;    while(i<h)    {        if(j==-1||(strcmp(s[i],s[j])==0))        {            i++;            j++;            next[i]=j;        }        else            j=next[j];    }    printf("%d\n",(h-next[h])*b);}int main(){    int i,j,b;    while(scanf("%d%d",&h,&w)!=EOF)    {        memset(cnt,0,sizeof(cnt));        for(i=0; i<h; i++)        {            scanf("%s",s[i]);            getnext(i);            j=w;            while(j)            {                cnt[w-next[j]]++;                j=next[j];            }        }        for(i=1; i<=w; i++)        {            if(cnt[i]==h)            {                b=i;                break;            }        }        for(i=0; i<h; i++)            s[i][b]=0;        kmp(b);    }    return 0;}/*2 5ABABAABABA22 8ABCDEFABABCDEABC162 8ABCDEFABAAAABAAA123 5ABABAABABAABABA2*/

1 0