Substrings
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 13039 | Accepted: 4626 |
Description
You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings.
Input
The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer n (1 <= n <= 100), the number of given strings, followed by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string.
Output
There should be one line per test case containing the length of the largest string found.
Sample Input
2 3 ABCD BCDFF BRCD 2 rose orchid
Sample Output
2 2
//题意:
//这个和上一个题(poj 3450 )一样(其实比3450那个题难度低了一等),给n个字符串,让你求出这n个字符串或它的逆字符串的最长公共子串的长度
//这个是将所有情况枚举,(代码不好,运行时间很长)。
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; char s[110][110]; char s1[110]; char s2[110]; int p[110]; void sstrcpy(char *a,char *b,int x,int y) { int i,k=0; for(i=x;i<=y;i++) a[k++]=b[i]; a[k]='\0'; } void getp(char *a) { int i=0,j=-1; p[i]=j; while(i<strlen(a)) { if(j==-1||a[i]==a[j]) { i++; j++; p[i]=j; } else j=p[j]; } } int kmp(char *a,char *b) { int i=0,j=0; int la=strlen(a); int lb=strlen(b); if(la>lb) return 0; getp(a); while(i<la&&j<lb) { if(i==-1||a[i]==b[j]) { i++; j++; } else i=p[i]; } if(i>=la) return 1; return 0; } int main() { int t,n,k,i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%s",s[i]); int l=strlen(s[0]); int maxl=0; for(int i=0;i<l;i++) { for(j=i;j<l;j++) { sstrcpy(s1,s[0],i,j);//逐个枚举 int ll=strlen(s1); for(k=0;k<l;k++)//子串的逆子串 s2[k]=s1[ll-k-1]; s2[ll]='\0'; for(k=1;k<n;k++) { if(!kmp(s1,s[k])&&!kmp(s2,s[k])) break; } if(k==n) maxl=max(maxl,j-i+1); } } printf("%d\n",maxl); } return 0; }