HDU - 2203 亲和串(Kmp)

时间:2023-01-03 19:25:06

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

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
/*************************************************************************************************************
        不知道什么原因 wa 了一下午,最后换了个模板 AC 了,以后就用这个模板,忘记之前的模板吧。
        值得注意一点的是输入:
        1,C++果断 tel; 所以采用 C 的输入。
        2,别一次两个字符串都输入,先输入一个到 EOF,在输入另一个,亲测如果同时输入会超时
*************************************************************************************************************/

int Next[100005];
char s[100005*2],p[100005];

void getNext(int m){
    int i=0,j=-1;
    Next[0]=-1;

    while(i < m){
        if(j == -1 || p[i] == p[j])
            Next[++i] = ++j;
        else
            j=Next[j];
    }
}

bool Kmp(int n,int m){
    getNext(m);
    int i = 0,j = 0;
    while(i < n && j < m){
        if(j == -1 || s[i] == p[j]){
            i++;
            j++;
        }
        else
            j=Next[j];
    }
    if(j >= m)  return true;
    else
        return false;
}

int main()
{
    while(scanf("%s",&s) != EOF){
        scanf("%s",&p);
        int lt1=strlen(s),lt2=strlen(p);
        if(lt1 < lt2) { cout<<"no"<<endl; continue;}

        strncpy(s+lt1,s,lt1);
        if(Kmp(lt1*2,lt2))
            cout<<"yes"<<endl;
        else
            cout<<"no"<<endl;
    }
    return 0;
}