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
题意:
给定 n 个字符串,求这 n 个字符串公共的最长子串 ( 最长子串是连续的,子序列不一定连续)
思路:
数据量较小,直接枚举
先求出最短的字符串,求出其 所有的子串 ,去其余 n - 1 个字符串中搜索,找公共的子串
用到 STL 中的 find() 、 reaverse() 、 substr()
用 b 存子串的时候,注意下标范围,开 b[5055]
长度为 n 的时候,总共子串为 n*(n+1) / 2 (不考虑重复子串)
CODE:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#define memset(a,n) memset(a,n,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long LL;
using namespace std;
string s[150],b[5055],d[5055];
map<string,int>m;
bool cmp(string a,string b) // 对string[] 按照长度排序
{
return a.size() < b.size();
}
int main()
{
int t,n;
string c,ss;
cin >> t;
while(t--){
m.clear();
int cnt = 0,cnt1 = 0;
cin >> n;
for(int i=0; i<n; i++)
cin >> s[i];
sort(s,s+n,cmp);
int len=s[0].size();
for(int i=0; i<len; i++){
for(int j=1; j<=len-i; j++){
c = s[0].substr(i,j); // c 为子串
ss = c;
reverse(ss.begin(),ss.end()); // 求 子串 的逆串
if(m[c] == 0){ // 注意! 存不重复的子串
m[c] = 1;
b[cnt++] = c;
d[cnt1++] = ss;
}
}
}
int maxx = 0,sum = 0;
for(int i=0; i<cnt; i++){
sum = 0;
for(int j=1; j<n; j++){
int pos = s[j].find(b[i]);
int pos1 = s[j].find(d[i]);
if(pos != -1 || pos1 != -1) // 两个出现一个就可以
sum++;
}
int data = b[i].size();
if(sum == (n - 1))
if(data > maxx)
maxx = data;
}
cout << maxx << endl;
}
return 0;
}