标签:not ati 计数 pac UI column sam 统计 nal
2 5 ABABA ABABASample Output
2Hint
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; char str[10010][80]; char a[80]; int f[10010];//用来统计最小重复长度是下标长度的行数有多少. int Next[10010]; int r,c,i,j,p,q,kuan; void getNext() { int j, k; j = 0; k = -1; Next[0] = -1; while(j < r) if(k == -1 ||!strcmp(str[j],str[k])) //进行多个字符数组之间的KMP操作 Next[++j] = ++k; else k = Next[k]; } int main() { while(scanf("%d%d",&r,&c)!=EOF) { for(int i=0;i<r;i++) scanf("%s",str[i]); memset(f,0,sizeof(f)); for(int i=0;i<r;i++){ memcpy(a,str[i],sizeof(str[i])); for(int j=c;j>0;j--) { a[j]=‘\0‘; for(p=0,q=0;str[i][q];p++,q++) { if(p==j)p=0; if(a[p]!=str[i][q])break; } if(!str[i][q])f[j]++;//能够匹配到字符串末端 即循环节成立,进行计数 } } for(i=1;i<=c;i++) { if(f[i]==r) //求得满足所有行数的最小重复长度 { kuan=i; break; } } for(i=0;i<r;i++)str[i][kuan]=‘\0‘;// 满足最小重复的宽度的前缀中进行KMP操作 getNext(); printf("%d\n",(r-Next[r])*kuan);//长*宽 即为最小的重复子矩阵 } return 0; }
标签:not ati 计数 pac UI column sam 统计 nal
原文地址:http://www.cnblogs.com/a249189046/p/7436254.html