HDU - 1238——Substrings (查找所有串中最长子串)

xiaoxiao2021-02-28  63

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 题意:找出所有字符串中的公共串,倒过来也算。 思路:使用strstr(a,b)函数(可以匹配b中是否存在a),直接暴力枚举,找出最短的串,用最短的串中的子串暴力枚举每一个串。 #include<algorithm> #include<stdio.h> #include<string.h> using namespace std; int t,n; char a[150][110]; int find_ans(int len,int index) { int flag; char S[110],pos[110],iny[110]; strcpy(S,a[index]); int l=len; while(l>0) { for(int i=0; i<=len-l; i++) { flag=1; strncpy(pos,S+i,l); pos[l]='\0'; for(int j=0; j<l; j++) iny[j]=pos[l-j-1]; iny[l]='\0'; for(int j=0;j<n;j++) { if(strstr(a[j],pos)==NULL&&strstr(a[j],iny)==NULL) { flag=0; break; } } if(flag) break; } if(flag) break; --l; } return l; } int main() { int min_len,index; scanf("%d",&t); while(t--) { min_len=1000; scanf("%d",&n); for(int i=0; i<n; i++) { scanf("%s",a[i]); int len=strlen(a[i]); index=min_len>len?i:index; min_len=min_len>len?len:min_len; } printf("%d\n",find_ans(min_len,index)); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2623075.html

最新回复(0)