杭电1238—搜索入门题目&&字符串处理

18 篇文章 0 订阅
16 篇文章 0 订阅

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

        题目链接: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;
}
     拒绝暴力!!!!!!!!                                   













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值