亲和串

来源:互联网 发布:阿芙玫瑰焕白系列 知乎 编辑:程序博客网 时间:2024/05/30 04:58
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
Input
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
Output
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
Sample Input
AABCDCDAAASDASDF
Sample Output
yes

no

根据亲和串的定义,分别求s1在s2中及相反的最大子序列长度,如果相加之和为s2的长度,就是亲和串。

#include<cstdio>#include<cstring>#include<algorithm>#define maxn 100010using namespace std;char s1[maxn];char s2[maxn];int ne[maxn];int KMP(char a[],char b[]){    int k;    int la=strlen(a);    int lb=strlen(b);    for(int i=0,j=-1;i<=lb;i++,j++){        ne[i]=j;        while(j!=-1&&b[i]!=b[j]) j=ne[j];    }    for(int i=0,j=0;i<=la;i++,j++){        if(i==la){            k=j;        }        while(j!=-1&&a[i]!=b[j]) j=ne[j];    }    return k;}int main(){    while(~scanf("%s%s",&s1,&s2)){        int la=KMP(s1,s2);        int lb=KMP(s2,s1);        int k=strlen(s2);        if(la+lb==k) printf("yes\n");        else printf("no\n");    }    return 0;}

0 0
原创粉丝点击