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思路:这题如果自己写字符串的倒序,挺麻烦的。我们要善于运用c++提供的api,string里面有很多有用的东西,别忘了。给字符串排序,自己写个compare函数。从小到大排序,取出最小的字符串,遍历所有它的字串,再求出倒序字串。最后在各字符串看能否找到。代码:#include<cstring> #include<iostream> #include<algorithm> #include<cstdio> using namespace std; string ss[200]; int com(const string p, const string q) { return p.length() < q.length(); } int dfs(string & str, int n) { int len,i,j,k,maxx; len = str.length(); int flag = 1; //int ant = 0; for (i = len; i >= 1; i--)//长度 { for(j = 0; j+i <= len; j++)//起点 { string sub = str.substr(j,i); string ww = sub;//必须有个中间变量 string rsub = ww.assign(ww.rbegin(),ww.rend());//使用rbegin,rend时ww已经改变 for(k = 1; k < n; k++) { if (ss[k].find(sub) == -1 && ss[k].find(rsub) == -1) { flag = 0; break; } } if (flag) { maxx = sub.length(); return maxx; } flag = 1; } } return 0; } int main() { int t,n,i; scanf("%d",&t); while (t--) { scanf("%d",&n); for (i = 0; i < n; i++) { cin >> ss[i]; } sort(ss,ss+n,com); cout << dfs(ss[0],n) << endl; } return 0; }