如果不说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
*/