开始感觉这题很简单,直接暴力就行!!!但是显而易见,暴力是解决不了问题的,,特别是这题作为亚洲区预选赛的题目、、、、就更没那么容易过了。题目大意是这样的:给定一些字符串,类似最长公共子串,但是有点不同的是这题要考虑反串的情况,即如果反串满足最长子串,那同样是可以的。。。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1238
通过这题我们可以学到strdup(),strrev()等字符串处理函数!!!!
超时代码:本人感觉差不多。。。。
#include<stdio.h>
#include<string.h>
struct str
{
char a[101];
}str[101];
void substrings(char str1[],char str2[],int start,int end)
{
int i,j;
j=0;
for(i=start;i<end;i++)
str2[j++]=str1[i];
str2[j]='\0';
return ;
}
int main()
{
int k,n,i,j;
int max,minlen;
int x,y,t;
char p[101],q[101];
scanf("%d",&k);
while(k--)
{
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
scanf("%s",str[i].a);
//int minlen;
minlen=strlen(str[0].a);
for(i=1;i<n;i++)
if(minlen>strlen(str[i].a))
{
minlen=strlen(str[i].a);
x=i;//求最小子串
}
// int t;
max=-1;
//int x,y;
y=0;
for(i=0;i<minlen;i++)
for(j=i;j<minlen;j++)
{
substrings(str[x].a,p,i,j);//求子串
for(t=0;t<n;t++)
{
strcpy(q,str[t].a);
for(x=j-1;x>=i;x--)
q[y++]=str[t].a[x];
if(strstr(q,p)!=NULL||strstr(str[t].a,p)!=NULL)//判断是否有子串
continue;
else
break;
}
if(t>=n)//
{
if(max<j-i+1)
max=j-i;
}
}
printf("%d\n",max-1);
}
return 0;
}
//通过代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define swap(x, y, t) ((t)=(x),(x)=(y),(y) =(t))
struct std
{
char str[101];
}a[101];
int zichuan(char *p,char *q,int a,int b)
{
int i=0;
for(;a<b;a++)
p[i++]=q[a];
p[i]='\0';
return 0;
}
int main()
{
int t,n,i,j,k,max;
char *p,*q;
p=(char *)malloc(sizeof(char)*101);
q=(char *)malloc(sizeof(char)*101);
scanf("%d",&t);
while(t--)
{ max=0;
scanf("%d%*c",&n);
for(i=0;i<n;i++)
gets(a[i].str);
for(i=0;i<n;i++)
for(j=i;j<n;j++)
{
if(strlen(a[i].str)<strlen(a[j].str))
swap(a[i],a[j],a[101]);
}
for(i=0;i<strlen(a[0].str);i++)
for(j=i;j<strlen(a[0].str);j++)
{
zichuan(p,a[0].str,i,j);
for(k=1;k<n;k++)
{
q=strrev(strdup(a[k].str));
if(strstr(q,p)!=NULL||strstr(a[k].str,p)!=NULL)
continue;
else
break;
}
if(k>=n)
{
if(max<j-i+1)
max=j-i;
}
}
printf("%d\n",max); }
return 0;
}
拒绝暴力!!!!!!!!