HDU 1238 Substrings 细心的模拟

题意:给你n个串,问你他们的连续公共字串的最大长度,但是倒着也可以,EX:abcde==edcba 这种也算是连续公共字串。


想法:给你的数据很小100,直接暴力,我们可以知道,任意一个字符串都一定会有最长连续公共字串,所以我们可以任意找一个为标准,枚举他的所有连续字串,然后在于其他的n-1个串进行比较,处理的过程一定要细心。


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
char map[100+5][100+5];
int judge(int p,int l)
{
	int ed=p+l-1;
	int k,cnt=0;
	for(int i=2;i<=n;i++)
	{
		k=p;
		int len=strlen(map[i]);
		for(int j=0;j<len;j++)
		{
			if(k!=ed+1&&map[i][j]!=map[1][k]) k=p;
			if(map[i][j]==map[1][k]&&k<=ed) k++;
			if(k==ed+1) break;
		}
		if(k==ed+1) cnt++;
		else 
		{
			k=p;
			for(int j=len-1;j>=0;j--)
			{
				if(k!=ed+1&&map[i][j]!=map[1][k]) k=p;
				if(map[i][j]==map[1][k]&&k<=ed) k++;
				if(k==ed+1) break;
			}
			if(k==ed+1) cnt++;
		} 
	}
	if(cnt==n-1) return 1;
	else return 0;
}
void treatment()
{
	int res=0,mark=0;
	int len=strlen(map[1]);
	for(int i=1;i<=len;i++)
	{
		mark=0;
		for(int j=0;j<=len-i;j++)
		{
			if(judge(j,i)) 
			{
				mark=1;
				break;
			}
		}
		if(!mark)
		{
			res=i-1;
			break;
		}
		else res=i;
	}
	printf("%d\n",res);
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%s",map[i]);
		}
		treatment();
	}
	return 0;
}

你可能感兴趣的:(HDU 1238 Substrings 细心的模拟)