【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】亲和串)