您的位置:首页 > 其它

HDU 1238 Substrings

2015-04-29 20:53 381 查看


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<cmath>
#include<queue>
#include<algorithm>
#include<stack>
#include<string>
#include<iostream>
using namespace std;
const int maxn = 105;
int T, n, ans, flag;
string s[maxn], a, b;

bool cmp(const string &a, const string &b)
{
	return a.size() < b.size();
}

int main()
{
	scanf("%d", &T);
	while (T--)
	{
		scanf("%d", &n);
		for (int i = ans = 0; i < n; i++) cin >> s[i];
		sort(s, s + n, cmp);
		for (int i = s[0].size(); i; i--)
			for (int j = 0; s[0][i + j - 1]; j++)
			{
				a = s[0].substr(j, i);
				b.assign(a.rbegin(), a.rend());
				flag = 1;
				for (int k = 1; k < n; k++)
					if (s[k].find(a) == -1 && s[k].find(b) == -1){ flag = 0; break; }
				if (flag) { ans = max(ans, i); goto end; }
			}
		end:printf("%d\n", ans);
	}
	return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: