Substrings
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5631 Accepted Submission(s): 2477
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++中强大的stringAC代码:#include <iostream> #include <algorithm> #include <string> using namespace std; int cmp(string a,string b) { return a.size()<b.size(); } int main() { string s[105]; int t,n; cin>>t; while(t--) { cin>>n; for(int i=0; i<n; i++) cin>>s[i]; sort(s,s+n,cmp); int len=s[0].length(); int max=0; for(int j=1; j<=len; j++) for(int i=0; i+j<=len; i++) { string ss=s[0].substr(i,j); //substr(i,j)表示从s[i]开始截取j长度的字符串 int flag=1; for(int k=1; k<n; k++) if(s[k].find(ss)==s[k].npos) //找不到时返回s[k].npos { flag=0; break; } if(!flag) { flag=1; reverse(ss.begin(),ss.end()); //颠倒该子串 for(int q=1; q<n; q++) if(s[q].find(ss)==s[q].npos) { flag=0; break; } } if(flag) { if(j>max) max=j; } } cout<<max<<endl; } return 0; }