HDU 2203 亲和串(KMP)

来源:互联网 发布:魔方win10优化 编辑:程序博客网 时间:2024/06/07 22:30

亲和串

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15879 Accepted Submission(s): 6993

Problem Description
人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考,因为他在很小的时候就知道亲和串如何判断了,但是发现,现在长大了却不知道怎么去判断亲和串了,于是他只好又再一次来请教聪明且乐于助人的你来解决这个问题。
亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。

Input
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。

Output
如果s2是s1的亲和串,则输出”yes”,反之,输出”no”。每组测试的输出占一行。

Sample InputAABCDCDAAASDASDFSample OutputyesnoAuthorEddy

可以直接暴力的

#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){    char s1[200010],s2[100010];    int l,i;    while(scanf("%s%*c%s",s1,s2)!=EOF){        l = strlen(s1);        for( i = l ; i < 2*l-1 ; ++i )            s1[i] = s1[i-l];        if( strstr(s1,s2) != 0 )            printf("yes\n");        else printf("no\n");    }    return 0;}

用KMP求解

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;char s1[100002*2],s2[100005];int next[100002*2];void getnext(char s[],int next[]){    next[0]=-1;    int j=-1;    int len1=strlen(s);    for(int i=1;i<len1;i++)    {        while(j>-1&&s[j+1]!=s[i])            j=next[j];        if(s[j+1]==s[i])            j++;        next[i]=j;    }}int solve(int n,int m){    int i=0,j=0;    while(i<n&&j<m)    {        if(s1[i]==s2[j])            {i++;j++;}        else if(j==0)            i++;        else            j=next[j-1]+1;    }    if(j==l2) return 1;    else return -1;}int main(){    while(gets(s1)!=NULL)    {        gets(s2);        int l=strlen(s1),l2=strlen(s2);        if(l<l2)            cout<<"no"<<endl;        else        {            for(int j=l,i=0;i<l;i++)            {                s1[j+i]=s1[i];            }            s1[2*l-1]='\0';            getnext(s1,next);            int t=solve(2*l,l2);            if(t==-1)                cout<<"no"<<endl;            else                cout<<"yes"<<endl;        }    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 哪个品牌空调性价比高 哪个牌子的拉杆箱性价比高 瓷砖哪个牌子的性价比比较好 什么牌子的羽毛球拍性价比高 什么牌子的蓝牙耳机性价比高 男士钱包什么牌子性价比高 抽油烟机哪个牌子性价比高 液晶电视什么牌子性价比高 哪个牌子的油烟机性价比高 森海塞尔哪款耳机性价比高 哪个牌子的平板性价比高 蓝牙耳机什么牌子性价比高 什么牌子的充电宝性价比高 哪个牌子的按摩椅性价比高 机械键盘什么牌子性价比高 什么牌子台式电脑性价比高 哪个牌子的电动车性价比高 什么牌子的机械键盘性价比高 跑步机哪个牌子的性价比高 现在买什么电视性价比高 哪个牌子的粉底液性价比高 thinkpad哪个系列性价比高 什么牌子的平板电脑性价比高 什么牌子固态硬盘性价比高 哪个牌子的羽绒服性价比高 整体橱柜什么牌子性价比高 哪个牌子的微波炉性价比高 法国性大片在线播放联合传播 性传播疾病专科 接触性传播 通过性传播的疾病 性传播疾病医院 性传播疾病挂什么科 怎样预防性传播疾病 性传播疾病传播方式 尿道炎性传播 男性性传播疾病 女性性传播疾病医院 性传播疾病检查多少钱 性传播疾病诊疗 性传播疾病都有哪些