H - Substrings
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
用set把子串集排序,然后查找。(因为没考虑到子串为空的情况WA了一发嘤嘤嘤)
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string>
#include<set>
using namespace std;
struct comp{
bool operator()(const string &a,const string &b){
if(a.size()!=b.size())
return a.size()<b.size();
else
return a<b;
}
};
struct mycomp{
bool operator()(const string &a,const string &b){
if(a.size()!=b.size())
return b.size()<a.size();
else
return b<a;
}
};
int main(){
int t,n;
string s[110];
cin>>t;
while(t--)
{
int f=0;
set<string,comp> str;
set<string,mycomp> sub;
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i],str.insert(s[i]);
string QAQ=*str.begin(); //输入中最短的字符串 QAQ
for(int i=0;i<=QAQ.size();i++)
for(int j=QAQ.size()-i;j>0;j--)
{
string QWQ=QAQ.substr(i,j);
sub.insert(QWQ);
} // QAQ的子串集sub
set<string,mycomp>::iterator it;
for(it=sub.begin();it!=sub.end();it++)
{
int count=0;
string QWQ=*it;
// cout<<QWQ<<endl;
for(int i=1;i<=n;i++)
{
QAQ=s[i];
if(QAQ.find(QWQ)!=-1)
count++;
else{
reverse(QWQ.begin(),QWQ.end());
if(QAQ.find(QWQ)!=-1)
count++;
}
}
if(count==n)
{
cout<<QWQ.size()<<endl;
f=1;
break;
}
}
if(f==0)
cout<<0<<endl;
}
return 0;
}