2011百校联动“菜鸟杯”程序设计公开赛 &&Powerful Incantation

 kmp暴力求解飘过,,,

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
string a,b;
int nex[6];
void kmp()
{ int n;
  n=b.size();
  nex[0]=0;
  int i=0,j=1;
  while(j<n)
  { if(b[j]==b[i])
     {nex[j]=i+1;
       i++;j++;
     }
  else { if(i>0)  i=nex[i-1];
        else    nex[j++]=0;
       }
  }
}
int main()
{ int Case;
  cin>>Case;
   while(Case--)
   {  cin>>a>>b;
     memset(nex,0,sizeof(nex));
	    kmp();
      int n=a.size();
	  int m=b.size();
	  int num=0;
	  int i=0,j=0;
	  while(i<n)
	  { 
		  if(a[i]==b[j])
	     {  
		  if(j==m-1) {num++;i++;j=0;}
		  else {i++;j++;}
	     }
		  else{ if(j>0) j=nex[j-1];
		        else   i++;
               }
	  }
	  cout<<num<<endl;
   }return 0;
}

直接方法:

#include<string.h>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{ int Case;
  cin>>Case;
  while(Case--)
  { char a[1000005];
     char b[6];
	 scanf("%s%s",a,b);
	 int n=strlen(a);
	 int m=strlen(b);
	 bool flag;
	 int num=0;
	 for(int i=0;i+m-1<n;++i)
		{  flag=true;
			for(int j=0;j<m;++j)
			 if(a[i+j]!=b[j])
			  {  flag=false;break;}
			 if(flag) {num++;i+=m-1;}
	     }
	 cout<<num<<endl;
  }return 0;
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值