/*题意:求最小循环模块的面积
必然存在一个最小循环模块的起点为(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 5
ABABA
ABABA
2
2 8
ABCDEFAB
ABCDEABC
16
2 8
ABCDEFAB
AAAABAAA
12
3 5
ABABA
ABABA
ABABA
2
*/POJ 2185 KMP (最小循环模块),布布扣,bubuko.com
原文:http://blog.csdn.net/littlefool5201314/article/details/23102463