题意:给一个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; }