HDU--2203-亲和串

//该题要求一个串循环后是否包含另外一个串,其实只要将母串重复一次再进行KMP匹配就行了,因为在重复母串的过程中,其实据已经将循环后的所有可能都列举出来了,比如串 "ABCD" 重复后为  "ABCDABCD" 在这个串中 "BCDA" , "CDAB" 以及 "DABC" 都相继出现了。用该种方法求解的过程中还应注意当子串长度超过母串时不进行匹配,因为那样可能输出错误的判断,比如上例中子串为 "ABCDA" 那么也会输出 yes 了。 //

AC代码:

#include<stdio.h>
#include<string.h>
#define N 100005
char s[N]; char t[N]; int next[N]; int len1; int len2; void get_next() { int i=0; int j=-1;
    next[0]=-1; while(i<len1) { if(j==-1||t[i]==t[j]) {
            i++;
            j++;
            next[i]=j; } else {
            j=next[j]; } } } int kmp() { int i=0; int j=0; while(i<len2) { if(j==-1||s[i]==t[j]) {
            i++;
            j++; } else {
            j=next[j]; } if(j==len1) { return 1; } } return 0; } int main() { while(scanf("%s%s",s,t)!=EOF) {
        len2=strlen(s);
        len1=strlen(t);
        memset(next,0,sizeof(next)); int i,j; for(i=0,j=len2;i<len2;i++,j++) {
            s[j]=s[i]; }
        len2=2*len2;
        get_next(); if(kmp()) {
            printf("yes\n"); } else {
            printf("no\n"); } } return 0; }

你可能感兴趣的:(HDU--2203-亲和串)