您的位置:首页 > 其它

(简单) 搜索 HOJ 1066 Substrings

2014-02-08 09:51 2076 查看

Substrings

My Tags  (Edit)
Source : ACM ICPC Tehran 2002 Preliminery Contest
Time limit : 1 secMemory limit : 32 M
Submitted : 568, Accepted : 191You 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[/b]
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[/b] 
There should be one line per test case containing the length of the largest string found. 
Sample Input[/b] 
2
3
ABCD
BCDFF
BRCD
2
rose
orchid

Sample Output[/b] 
2
2


题意:给一系列字符串,找出一个字符串X使得任意给的字符串里面都能找到X或者是反过来的X,然后要输出最大的X的长度,这里有点坑 ,是字符的值得和最大的长度,而不是长度最长的。
思路: 暴搜吧  反正也是0ms过

代码:#include<iostream>#include<cstdio>#include<string.h>#include<algorithm>#include<string>#include<deque>#include<queue>#include<math.h>#include<vector>using namespace std;#define MAX 100000+10#define MOD 99997const int inf = 0xfffffff;
char input[110][110];int len[110];

int n;
bool isOk(char  s[] , int s_len){ int move = 1; bool flag; for (int i = 2 ; i <= n ; ++i) { flag = false; for (int j = 1 ; j <= len[i]-s_len+1 ; ++j) if (input[i][j]==s[1]) { int k = 1; while (k<=s_len && s[k]==input[i][j+k-1]) ++k; if (k==s_len+1) { flag = true; break; } } if (flag) continue; for (int j = 1 ; j <= len[i]-s_len+1 ; ++j) if (input[i][j]==s[s_len]) { int k = 1; while (k<=s_len && input[i][j+k-1]==s[s_len-k+1]) ++k; if (k>s_len) { flag = true; break; } } if (!flag) return false; } return true;}int main(){ int T; cin>>T; while (T--) { scanf("%d",&n); int k = 1; for (int i = 1 ; i <= n ; ++i) { scanf("%s",input[i]+1); len[i] = strlen(input[i]+1); k = !k; } bool  flag = false; k = !k; char X[110]; int X_len = 0; int largest = -inf; int ans = 0; for (int i = 1 ; i <= len[1] ; ++i) { X_len = 0; int j = i; int sum = 0; while (j <= len[1])  { X[++X_len] = input[1][j]; sum += input[1][j]; if (sum>largest && isOk(X,X_len)) { largest = sum; ans = X_len; } ++j; } } printf("%d\n",ans); }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: