Substrings
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10797 Accepted Submission(s): 5167
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
Author
Asia 2002, Tehran (Iran), Preliminary
Recommend
主要是数据太水了。。。
#include <ctime>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 105;
int n,i,j,k;
string str[maxn];
bool cmp(string a, string b) {
return a.length()<b.length();
}
void init(){
cin >> n;
for (i=1; i<=n; i++) cin >> str[i];
sort(str+1,str+n+1,cmp);
}
int Find(){
int tmp,len;
bool flag;
string s = str[1];
len = s.length();
string temp,retmp;
for (i=len; i>=1; i--) {
for (j=0;j+i<=len; j++) {
flag = 1;
temp = s.substr(j,i); //从第j位开始复制长度i的字符串
retmp = temp;
reverse(retmp.begin(),retmp.end()); //反转
for (k=2; k<=n; k++)
if (str[k].find(temp)==-1 && str[k].find(retmp)==-1) {
flag = 0;
break;
}
if (flag) return i;
}
}
return 0;
}
int main(){
std::ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--) {
init();
cout << Find() << endl;
}
return 0;
}