zoj 1374 &&2784&&2907 字符串搜索

如果不说kmp的话,3个题目都可以说是水题,kmp上数据结构的时候学过,但没研究过,不是很懂。这3个题目都是一个类型,只说下1374,其他两题都是其简化版,唯一难点的可能在于输出要按字典序。。。暂时也没想看kmp。>,<

zoj 1374 Substrings题意:

 

给出n个字符串,要求从中找出最长子串,正反都行。

 

分析:

先找出其中最短字符串,再枚举之中的子串,然后在全部串中查找。

强大的strstr函数:

strstr(char *haystack,char *needle) :

从字符串haystack中寻找needle第一次出现的位置。、、

#include<stdio.h>
#include<string.h>
int main()
{
	char str[105][105],up[105],back[105];
	int t,n,i,j,k,min,temp,len,num;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		min=999;
		for(i=0;i<n;i++)
		{
			scanf("%s",str[i]);
			len=strlen(str[i]);
			if(min>len)
			{
				min=len;
				temp=i;
			}
		}
		for(i=1;i<=min;i++)//i是目标子串的终点故....
		{
			for(j=0;j+i-1<min;j++)//j+i-1是目标子串的长度,j是起点
			{
				for(k=0;k<i;k++)//构造正反串
				{
					up[k]=str[temp][k+j];
					back[k]=str[temp][i+j-k-1];//搞造反串这里还是有点问题。
				}
				up[k]='\0';
				back[k]='\0';//这里不可省略,字符串数组的结束标志
				for(k=0;k<n;k++)//查找,strstr函数的巧妙运用
				{
					if(strstr(str[k],up)==NULL&&strstr(str[k],back)==NULL)
						break;
				}
				if(k>=n)
				{
					num=i;
				}
			}
		}
		printf("%d\n",num);
	}
	return 0;
}

zoj 2784 blue jeans 去年校赛的题目,简单的求子串

#include<stdio.h>
#include <string.h>
int main()
{
	int n,m;
	char str[12][62],a[62],b[62];
	int i,j,len,num,tmp,k,t;
	scanf("%d",&n);
	while(n--)
	{
		num=0;
		scanf("%d",&m);
		for(i=0;i<m;i++)
			scanf("%s",str[i]);
		len=strlen(str[0]);
		for(i=1;i<=len;i++)
		{
			for(j=0;j+i-1<len;j++)
			{
				for(k=0;k<i;k++)
				{
					a[k]=str[0][j+k];
				}
				a[k]='\0';
				for(k=0;k<m;k++)
				{
					if(strstr(str[k],a)==NULL)
						break;
				}
				if(k>=m)
				{
					tmp=strlen(a);		
					if(tmp==num)
					{
						for(t=0;t<num;t++)
						{
							if(a[t]<b[t]) 
							{
								for(t=0;t<=num;t++)
									b[t]=a[t];
								break;
							}
						}
					}
					if(tmp>num)
					{
						num=tmp;
						for(t=0;t<=num;t++)
						{
							b[t]=a[t];
						}
					}

				}
			}
		}
		if(num>=3)
		printf("%s\n",b);
		else printf("no significant commonalities\n");
	}
	return 0;
}



zoj 2907 Corporate Identity,==b

差不多的题目。将暴力进行到底!!!

#include<stdio.h>
#include <string.h>
int main()
{
	int m;
	char str[4005][205],a[205],b[205];
	int i,j,len,num,tmp,k,t,l1=255,pos;
	while(scanf("%d",&m)!=EOF)
	{
		num=0;
		l1=255;
		if(m==0) break;
		for(i=0;i<m;i++)
		{
			scanf("%s",str[i]);
			len=strlen(str[i]);
			if(len<l1)
			{
				l1=len;
				pos=i;
			}
		}
		for(i=1;i<=l1;i++)
		{
			for(j=0;j+i-1<l1;j++)
			{
				for(k=0;k<i;k++)
				{
					a[k]=str[pos][j+k];
				}
				a[k]='\0';
				for(k=0;k<m;k++)
				{
					if(strstr(str[k],a)==NULL)	break;
				}
				if(k>=m)
				{
					tmp=strlen(a);
					if(tmp==num)
					{
						for(t=0;t<num;t++)
						{
							if(a[t]>b[t]) break;
							if(a[t]<b[t]) 
							{
								for(t=0;t<=num;t++)
									b[t]=a[t];
								break;
							}
						}
					}
					if(tmp>num)
					{
						num=tmp;
						for(t=0;t<=num;t++)
						{
							b[t]=a[t];
						}
					}
				}
			}
		}
		if(num>=1)
		printf("%s\n",b);
		else printf("IDENTITY LOST\n");
	}
	return 0;
}

/*
3
abcclaab
abccdaab
abcckaab
*/
/*
3
asdsaaa
sdswssaaa
sdsaaa
*/





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值