Substrings


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9011    Accepted Submission(s): 4245


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


 


题意:给我们n个字符串,问我们其中三个的最长公共子序列或者反序列长度是多少,由于这里的数据很弱,我们可以直接借用C++ String类型的一些库函数进行暴力求解~。


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int n;
const int maxn = 100+10;
string str[maxn];
int cmp(string a,string b)
{
return a.length() < b.length();
}
int dfs(string &s)
{
int len = s.length();
int flag = 1;
for(int i=len; i>=1; i--)
for(int j=0; i+j<=len; j++)
{
string temp = s.substr(j,i);
string t = temp;
string retemp = t.assign(t.rbegin(),t.rend());
for(int k=1; k<n; k++)
if(str[k].find(temp) == -1 && str[k].find(retemp) == -1)
{
flag = 0;
break;
}
if(flag) return temp.length();
flag = 1;
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0; i<n; i++)
cin >> str[i];
sort(str,str+n,cmp);
int ans = dfs(str[0]);
printf("%d\n",ans);
}
}