KMP亲和串|hdu 2203

循环移位 -> 复制两倍串长再匹配子串

复制两倍串长

int slen = strlen(s);
strncpy(s+slen,s,slen);

http://acm.split.hdu.edu.cn/showproblem.php?pid=2203

#include<iostream>
#include<string.h>
#define maxn 100000+5

using namespace std;

char s[maxn];
char p[maxn];
int Next[maxn];

void getNext(const char p[],int Next[]) {
    int plen = strlen(p);
    Next[0] = -1;
    int k=-1;
    int j=0;
    while(j<plen-1) {

        if(k==-1||p[j]==p[k]) {
            k++;
            j++;
            if(p[j]!=p[k]) {
                Next[j] = k;
            } else {
                Next[j] = Next[k];
            }
        }

        else {
            k = Next[k];
        }
    }
};

bool KMP(const char s[],const char p[]) {
    int slen = strlen(s);
    int plen = strlen(p);

    int i=0;
    int j=0;

    bool flag = false;
    int times=0;


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

    if(j>=plen)flag = true;
    return flag;
}
int main() {
    while(~scanf("%s%s",s,p)) {

        int slen = strlen(s);
        strncpy(s+slen,s,slen);
        memset(Next,-1,sizeof(Next));
        getNext(p,Next);
        /*
        cout<<p<<endl;
        for(int i=0;i<10;i++)
            cout<<Next[i];
        cout<<endl;
        */
        if(KMP(s,p))
            cout<<"yes"<<endl;
        if(!KMP(s,p))
            cout<<"no"<<endl;

    }

    return 0;
}

Problem Description

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

Input

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

Output

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

Sample Input

AABCD
CDAA
ASD
ASDF

Output

yes
no

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • 不错的博客求next数组: 注意:求next数组得到的最长公共前缀后缀是可以重叠的:比如:ababa,next[5...
    Gitfan阅读 4,381评论 0 0
  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 5,291评论 1 5
  • String类 1、String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,...
    简诗阅读 3,077评论 0 1
  • 写作积累: Day 1 1. dip: …where the main road dipped down into...
    莺啼树暖阅读 4,948评论 0 0