Substrings
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13779 Accepted Submission(s):
6689
http://acm.hdu.edu.cn/showproblem.php?pid=1238
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
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int maxn=100+3; char str[maxn]; string ansstr,ss; string str2[maxn]; int t,n; int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",str); str2[i]=str; } string temp=str2[0]; int len=temp.size(); int ans=0; for(int i=0;i<len;i++){ for(int j=1;j+i<=len;j++){ int cnt=1; ss=temp.substr(i,j); for(int k=1;k<n;k++){ if(str2[k].find(ss)!=-1){ cnt++; } } if(cnt==n){ if(ans<j){ ans=j; ansstr=ss; }else if(ans==j){ ansstr=min(ansstr,ss); } } } } reverse(temp.begin(),temp.end()); for(int i=0;i<len;i++){ for(int j=1;j+i<=len;j++){ int cnt=1; ss=temp.substr(i,j); for(int k=1;k<n;k++){ if(str2[k].find(ss)!=-1){ cnt++; } } if(cnt==n){ if(ans<j){ ans=j; ansstr=ss; }else if(ans==j){ ansstr=min(ansstr,ss); } } } } printf("%d\n",ans); } }
#include<stdio.h>//网上大佬的代码 #include<algorithm> #include<iostream> #include<string.h> using namespace std; const int maxn = 105; char str[maxn]; string ansstr; string str2[maxn]; int main() { int n,t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",str); str2[i]=str; } int ans=0; string tmp=str2[0]; int tmplen=tmp.size(); for(int i=0;i<tmplen;i++) { for(int j=1;i+j<=tmplen;j++) { int cnt=1; string ss=tmp.substr(i,j); for(int k=1;k<n;k++) { if(str2[k].find(ss)!=-1) cnt++; } if(cnt==n) { if(ans<j) { ans=j; ansstr=ss; } else if(ans==j) { ansstr=min(ansstr,ss); } } } } reverse(tmp.begin(),tmp.end());//reverse()会将区间[beg,end)内的元素全部逆序; for(int i=0;i<tmplen;i++) { for(int j=1;i+j<=tmplen;j++) { int cnt=1; string ss=tmp.substr(i,j); for(int k=1;k<n;k++) { if(str2[k].find(ss)!=-1) cnt++; } if(cnt==n) { // cout<<ss<<" "<<cnt<<endl; if(ans<j) { ans=j; ansstr=ss; } else if(ans==j) { ansstr=min(ansstr,ss); } } } } printf("%d\n",ans); } }
原文地址:https://www.cnblogs.com/qqshiacm/p/11599482.html