Substrings
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8500 Accepted Submission(s): 3927
Total Submission(s): 8500 Accepted Submission(s): 3927
Problem 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 file 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直接暴力!#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 150 struct line { char s[N]; int len; }num[N]; int cmp(line a,line b) { return a.len <b.len ; } int n,m,len1,len2; int main() { int i,j,k,v; char b[N],p[N],q[N]; scanf("%d",&n); while(n--) { int sum=0; scanf("%d",&m); for(i=0;i<m;i++) { scanf("%s",num[i].s ); num[i].len =strlen(num[i].s ); } sort(num,num+m,cmp); strcpy(b,num[0].s ); len1=strlen(b); for(i=0;i<len1;i++) for(j=i;j<len1;j++) { k=0; memset(p,'\0',sizeof(p)); memset(q,'\0',sizeof(q)); char high,low; for(low=i,high=j;low<=j,high>=i;low++,high--) { q[k]=b[low]; p[k]=b[high]; k++; } int exit=1; len2=strlen(q); for(v=1;v<m;v++) { if(strstr(num[v].s ,q)==0&&strstr(num[v].s ,p)==0) { exit=0; break; } } if(exit&&len2>sum) sum=len2; } printf("%d\n",sum); } return 0; }