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
思路
KMP + 暴力枚举最短的一个字符串的所有子串与其他字符串匹配。采用string容器操作起来更加方便快捷翻转采用reverse函数,其余的就是KMP的模板。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
string s[105];
int num[105];
int n,index;
void get_next(string str,int len)
{
memset(num,-1,sizeof(num));
int i = 0,j = -1;
while(i < len){
if(j == -1 || str[i] == str[j]){
i++;j++;
num[i] = j;
}
else{
j = num[j];
}
}
}
bool kmp(string str,string p)
{
int a = str.size();
int b = p.size();
int i = 0,j = 0;
while(i < a && j < b){
if(j == -1 || str[i] == p[j]){
i++;j++;
}
else{
j = num[j];
}
}
if(j == b){
return true;
}
return false;
}
int solve(int ans,string str)
{
int len = str.size();
get_next(str,len);
bool flag = true;
for(int k = 0;k < n;k++){
if(k == index) continue;
if(!kmp(s[k],str)){
flag = false;
break;
}
}
if(flag) ans = max(ans,len);
return ans;
}
int main()
{
int t;
cin >> t;
while(t--){
cin >> n;
int len = 1000;index = 0;
for(int i = 0;i < n;i++){
cin >> s[i];
if(s[i].size() < len){
index = i;
len = s[i].size();
}
}
int ans = 0;
for(int i = 0;i < len;i++){
for(int j = 1;j <= len;j++){
string str = s[index].substr(i,j);
ans = solve(ans,str);
reverse(str.begin(),str.end());
ans = solve(ans,str);
}
}
cout << ans << endl;
}
return 0;
}
愿你走出半生,归来仍是少年~