Substrings
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9003 Accepted Submission(s): 4238
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
题意:给你n个字符串(n<=100),每个字符串的长度小于等于100,求最长的子串,这个子串或者他的逆序子串出现在每个字符串中。
思路:暴力枚举最长字串的长度i,然后枚举第一个字符串中长度为i的子串有哪些情况,判断这个子串是否在所有的字符串中出现即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
bool cmp(string s1,string s2){
return s1.size()<s2.size();
}
int main(){
string s[101];
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<n;i++)
cin>>s[i];
sort(s,s+n,cmp);
int len=s[0].size();
int maxn=0;
for(int i=0;i<len;i++)
for(int j=i;j<len;j++){
int count=j-i+1;
if(count<=maxn){
continue;
}
string s1;
for(int k=i;k<=j;k++)
s1+=s[0][k];
string s2=s1;
reverse(s2.begin(),s2.end());
int flag=1;
for(int k=1;k<n;k++){
if(s[k].find(s1)==string::npos&&s[k].find(s2)==string::npos){
flag=0;
break;
}
}
if(flag==1&&count>maxn)
maxn=count;
}
cout<<maxn<<endl;
}
return 0;
}