hdoj 1238 Substrings(字符串的子串)

本文探讨了一个在给定字符串集合中查找最大子串的问题,该子串可以正向或反向出现在任意字符串中。通过输入数据集的处理,文章详细介绍了算法实现过程及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Substrings

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 8500    Accepted Submission(s): 3927


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<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N  150
struct line 
{
	char  s[N];
	int   len;
}num[N];
int cmp(line a,line b)
{
	return a.len <b.len ;
}
int n,m,len1,len2;
int main()
{
	int i,j,k,v;
	char b[N],p[N],q[N];
    scanf("%d",&n);
	while(n--)
	{
		int sum=0;
		scanf("%d",&m);
		for(i=0;i<m;i++)
		{
			scanf("%s",num[i].s );
			num[i].len =strlen(num[i].s );
		}
		sort(num,num+m,cmp);
		strcpy(b,num[0].s );
		len1=strlen(b);
		for(i=0;i<len1;i++)
		 for(j=i;j<len1;j++)
		  {
		  	k=0;
		  	memset(p,'\0',sizeof(p));
		  	memset(q,'\0',sizeof(q));
		  	char high,low;
		  	for(low=i,high=j;low<=j,high>=i;low++,high--)
		  	{
		  		q[k]=b[low];
		  		p[k]=b[high];
		  		k++;
			}
			int exit=1;
			len2=strlen(q);
			for(v=1;v<m;v++)
			 {
			 	if(strstr(num[v].s ,q)==0&&strstr(num[v].s ,p)==0)
			 	{
			 		exit=0;
			 		break;
				 }
			 }
			 if(exit&&len2>sum)
			 sum=len2;
		  }
		  printf("%d\n",sum);
	} 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值