HDU 2203亲和串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2203亲和串相关的知识,希望对你有一定的参考价值。

题意

给你一个字符串s1,字符串s2,s1循环移位,使s2包含在s1中,则s2 是s1的亲和串

分析

把s1自身复制一遍接在后面。

方法一: 用strstr函数。

方法二: KMP算法。

方法三: 用C++的string的find函数。

代码

方法一:

#include<cstdio>
#include<cstring>
char s1[200009],s2[100009];
int len;
int main()
{
    while(~scanf("%s",&s1))
    {
        len=strlen(s1);
        
        for(int i=0; i<len; i++)
            s1[len+i]=s1[i];
            
        scanf("%s",&s2);
        
        if(strstr(s1,s2)-s1>=0) printf("yes\n");
        else printf("no\n");
        
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
    }
    return 0;
}

方法二:

#include<cstdio>
#include<cstring>
char S[200005],T[100005];
int next[100005],len;

void getNext(){
    int i,k=-1;
    next[0]=k;
    for(i=1;T[i];i++){
        while(k>=0 && T[i]!=T[k+1]) k=next[k];
        if (T[i]==T[k+1]) k++;
        next[i]=k;
    }
}

int KMP(){
    int i=0,j=0;
    while(i==-1||S[j]&&T[i]){
        if(i==-1||S[j]==T[i]){
            i++;
            j++;
        }else
            i=next[i];
    }
    if(!T[i])
        return j-i+1;
    return -1;
}

int main()
{
    while(~scanf("%s",S))
    {
        len=strlen(S);
        for(int i=len;i<2*len;i++)
            S[i]=S[i-len];

        scanf("%s",T);
        getNext();
        if(KMP()<0) printf("no\n");
        else printf("yes\n");
        memset(S,0,sizeof(S));
        memset(T,0,sizeof(T));
    }
    return 0;
}

方法三

#include<iostream>
using namespace std;

int main()
{
    string P,T;
    while(cin>>P>>T)
    {
        P+=P;
        if(P.find(T)!=string::npos)cout<<"yes"<<endl;
        else cout<<"no"<<endl;
    }
    return 0;
}

以上是关于HDU 2203亲和串的主要内容,如果未能解决你的问题,请参考以下文章

HDU 2203 亲和串(KMP)

HDU 2203: 亲和串

hdu 2203 亲和串 (KMP)

HDU2203 亲和串

HDU 2203 亲和串(多个字符串函数的运用)

HDOJ/HDU 2203 亲和串(简单的判断~Java的indexOf()方法秒)