hdu 2203 亲和串 (字符串__KMP)

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


题目描述:给定两个串s1,s2,问是否能够通过对s1串进行位移操作使得新串ss1中包含s2


解题思路:看到题目,我们假设可以通过位移使得s1中含s2,即s1前面的串可以用在串的后面使得s2可以匹配,这样很自然地想到在s1后面在补上s1,让两个s1拼接一个新串ss,在ss中计算next数组,再让s2与ss匹配即可。


测试数据:

cc a
ccc aa


代码

#include <stdio.h>
#include <string.h>
#define MAX 100010


int la,lb,lc,next[MAX*2];
char s1[MAX],s2[MAX],s3[MAX*2];


int KMP() {

    int i,j,k;
    strcpy(s3,s1),strcat(s3,s1);
    lc = strlen(s3);

    //next[]
    i = 0,j = -1,next[i] = -1;
    while (s3[i]) {

        if (j == -1 || s3[i] == s3[j])
            i++,j++,next[i] = j;
        else j = next[j];
    }


    //match()
    i = j = 0;
    while (s3[i]) {

        if (j == -1|| s3[i] == s2[j])
            i++,j++;
        else j = next[j];
        if (j == lb) return 1;
    }
    return 0;
}


int main()
{
    while (scanf("%s%s",s1,s2) != EOF) {

        la = strlen(s1);
        lb = strlen(s2);
        if (la < lb) {

            printf("no\n");
            continue;
        }
        else {
            
            int flag = KMP();
            printf(flag ? "yes\n" : "no\n");
        }
    }
}

     url1=" http://www.ruc.edu.cn/"
      url2=" http://bt.ruc6.edu.cn/"
      url3=" http://www.cmr.com.cn/"
      url4=" http://www.iqh.edu.cn/"
      url5=" http://www.irm.cn/"
      url6=" http://www.rbs.org.cn/"

你可能感兴趣的:(测试)