题意:给一个n*m的大小的矩形,里面存一些字母,让你找出最小的串能够覆盖这个矩形。
例如:
aaaa 能让一个a完全覆盖。
ababa
ababa
能让ab覆盖。
思路: 我们先求解每行的最小覆盖C,然后再求每列的覆盖R,然后最小的覆盖就是C*R。
#include<stdio.h>
#include<string.h>
char str[10005][80];
int next[10005];
int n,m;
int gcd(int x,int y)
{
return y>0?gcd(y,x%y):x;
}
int get_next(char tem[])
{
int j=0,k=-1;
int len=strlen(tem);
next[0]=-1;
while(j<m)
{
if(k==-1||tem[j]==tem[k])
next[++j]=++k;
else
k=next[k];
}
return m-next[m];
}
int get_next1(char tem[10005][80],int pox)
{
int j=0,k=-1;
next[0]=-1;
while(j<n)
{
if(k==-1||tem[j][pox]==tem[k][pox])
next[++j]=++k;
else
k=next[k];
}
return n-next[n];
}
int main()
{
int i,j;
int suC,suR;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0; i<n; i++)
scanf("%s",str[i]);
int ans=1;
for(i=0; i<n; i++)
{
suC=get_next(str[i]);
ans=ans*suC/gcd(ans,suC);
}
if(ans>m)
ans=m;
int ans1=1;
for(i=0; i<m; i++)
{
suR=get_next1(str,i);
ans1=ans1*suR/gcd(ans1,suR);
}
if(ans1>n)
ans1=n;
//printf("ans=%d ans1=%d\n",ans,ans1);
printf("%d\n",ans*ans1);
}
return 0;
}