开始感觉这题很简单,直接暴力就行!!!但是显而易见,暴力是解决不了问题的,,特别是这题作为亚洲区预选赛的题目、、、、就更没那么容易过了。题目大意是这样的:给定一些字符串,类似最长公共子串,但是有点不同的是这题要考虑反串的情况,即如果反串满足最长子串,那同样是可以的。。。
题目链接: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; } 拒绝暴力!!!!!!!!