hdu2203 亲和串

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2203


题解:要求一个串循环后是否包含另外一个串,只要将母串重复一次再进行KMP匹配,因为在重复母串的过程中,其实据已经将循环后的所有可能都列举出来了,比如串 "ABCD" 重复后为  "ABCDABCD" 在这个串中 "BCDA" , "CDAB" 以及 "DABC" 都接踵呈现了。


#include <stdio.h>        
#include <string.h>        
#define MAXN 100001      
        
int next[MAXN],len1,len2;        
char str1[MAXN<<1],str2[MAXN];        
    
void getNext()        
{        
    int i=0,j=-1;         
    next[0]=-1;        
    while(i<len2)        
    {        
        if (j==-1||str2[i]==str2[j])        
        {        
            i++;        
            j++;        
            next[i]=j;        
        }        
        else        
            j=next[j];        
    }        
}        
        
int KMP()        
{        
    int i,j;        
    i=j=0;    
    getNext();    
    while(i<len1&&j<len2)        
    {        
        if(j==-1||str1[i]==str2[j])        
        {        
            i++;        
            j++;       
        }        
        else        
            j=next[j];      
    }        
    return j;  
}        
      
int main()      
{      
    int n,i;   
    while (scanf("%s %s",str1,str2)!=EOF)  
    {  
        len1=strlen(str1);  
        len2=strlen(str2); 
		if(len1<len2)
		{
			printf("no\n");
			continue;
		}
		for(i=0;i<len1;++i)
			str1[len1+i]=str1[i];
		str1[len1*2-1]='\0';
		len1=len1*2-1;
        n=KMP();  
        if(n==len2)
			printf("yes\n");
		else
			printf("no\n");
    }  
    return 0;      
}      


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值