您的位置:首页 > 其它

1238 Substrings

2016-02-07 13:47 363 查看
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<iostream>
#include<string>
#include<vector>
#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(const string s1, const string s2){
return s1.length() < s2.length();
}
int main(){
for (int case_num; scanf("%d", &case_num) != EOF;){
while (case_num--){
int num;
scanf("%d", &num);
vector<string>vec(num);
for (int i = 0; i < num; i++){
cin >> vec[i];
}
sort(vec.begin(), vec.end(), cmp);
int max_len = 0;
for (int i = 0; i < vec[0].length(); i++){
for (int len = 1; len <= vec[0].length() - i; len++){
string sub_str = vec[0].substr(i, len);
int flag = 0;
for (int index1 = 1; index1 < vec.size(); index1++){
//cout << "sub_str:" << sub_str << " str:" << vec[index1] << " find:" << vec[index1].find(sub_str, 0) << endl;
if (vec[index1].find(sub_str, 0) >= vec[index1].length()){
flag = 1;
break;
}
}
if (!flag){
if (len >= max_len){
max_len = len;
}
continue;
}
reverse(sub_str.begin(), sub_str.end());
flag = 0;
for (int index1 = 1; index1 < vec.size(); index1++){
//cout << "sub_str:" << sub_str << " str:" << vec[index1] << " find:" << vec[index1].find(sub_str, 0) << endl;
if (vec[index1].find(sub_str, 0) >= vec[index1].length()){
flag = 1;
break;
}
}
if (!flag){
if (len >= max_len){
max_len = len;
}
continue;
}
}
}
printf("%d\n", max_len);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: