KMPhdu2203

题意就是两个串s1,s2,如果s2是s1的子串就输出yes,不然输出no,而且s1从尾部到头部循环过来也算。就比如样例中的AABCD 和 CDAA,这样也算匹配成功。
思路:用KMP算法查找子串就可以了,事先把s1自我复制一遍,就比如AABCD,把它复制成AABCDAABCD,再当作主串去比较就可以了。貌似c++有个函数strstr()可以直接匹配子串欸。

    #include<stdio.h>  
    #include<string.h>  
    #include<cstring>  
    #define val 100005  
    int lens,lenp,next[val];  
    char s[val*2],p[val]; 
    void GetNext()  //求Next数组
    {  
        int j,k;  
        j=0,k=-1;  
        next[j]=k;  
        while(j<lenp)  
        {  
            if(k==-1||p[j]==p[k])  
            {  
                k++;  
                j++;  
                next[j]=k;  
            }  
            else k=next[k];  //KMP算法中最难懂的一步
        }  
    }     
    int kmp()  
    {  
        int i,j;  
        i=j=0;  
        GetNext();  
        while(i<lens&&j<lenp)  
        {  
            if(j==-1||s[i]==p[j])  
            {  
                i++;  
                j++;  
            }  
            else j=next[j];  
        }  
        if(j<lenp) return 0;  
        else return 1;  
    }  
    int main()  
    {  
        while(scanf("%s",s)!=EOF)  
        {  
            scanf("%s",&p);  
            lens=strlen(s);  
            lenp=strlen(p);  
            strncpy(s+lens,s,lens);  //自我复制
            lens*=2;  
            if(kmp()) printf("yes\n");  
            else printf("no\n");  
        }  
        return 0;  
    }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值