HDU2203 KMP

                          亲和串

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

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

 

Sample Output


yes
no

 

Author

Eddy

Recommend

lcy

 

题解:这题是字符串匹配的简单题 简单使用KMP算法模板或者AC自动机模板就能够A 起初还是怀疑string类型存储的字符有限

上网查了一下发现string类型所存储的字符是无尽的 这题我用的是KMP算法做的 主要考虑循环  就是两个母串首尾相连 就能够

解决这个问题 剩下的就是字符串匹配了 按照构造next数组KMP的模板 就能轻松A 题意没有叙述清楚子串能不能比母串长

所以这里我有优化就是当母串小于子串 直接输出 不做匹配 实际上确实是这样 详细见代码

 

 

#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;

string s0,s1,s2;
int next[200005];
void get_next(const string sub, int *next)
{
    int len=sub.length();
    int i,k;
    next[0]=k=-1;
    for (i=0; i<len;)
    {
        if (k==-1 || sub[i]==sub[k])
        {
            k++;
            i++;
            if (sub[k]!=sub[i]) next[i]=k;
            else next[i]=next[k];    //避免重复计算优化next数组
        }
        else k=next[k];
    }
}
int KMP(const string str, const string sub, const int *next)    //返回子串在主串中的起始位置下标
{
    int i,j;
    int len1=str.length();
    int len2=sub.length();
    for (i=0, j=0; i<len1 && j<len2;)
    {
        if (j==-1 || str[i]==sub[j])
        {
            i++;
            j++;
        }
        else
        {
            j=next[j];
        }

    }
    if (j==len2) return i-len2;
    return -1;    //如果找不到就返回-1
}
int main()
{
    while(cin>>s0>>s2)
    {
        if(s2.length()>s0.length())
        {
            cout<<"no"<<endl;
        }
        else
        {
            s1=s0+s0;
            get_next(s2,next);
            int ans=KMP(s1,s2,next);
            // cout<<ans<<endl;
            if(ans==-1)
                cout<<"no"<<endl;
            else
                cout<<"yes"<<endl;
        }
    }
    return 0;
}
时间: 2024-08-29 08:27:10

HDU2203 KMP的相关文章

KMP专题【完结】

第一题 hdu 1711 Number Sequence 点击打开hdu 1711 思路: 1 kmp是用来匹配字符串,只能够匹配单一的字符串 2 kmp的算法的过程:   1:假设文本串的长度为n,模式串的长度为m:   2:先例用O(m)的时间去预处理next数组,next数组的意思指的是当前的字符串匹配失败后要转到的下一个状态:   3:利用o(n)的时间去完成匹配: 3 时间复杂度为o(n+m)即o(n): 点击查看代码 第二题 hdu 1686 oulipo 点击打开hdu 1686

c# kmp算法 (边界条件未处理好,有待改正)

算法|条件   using System; namespace kmp{ /// <summary> /// Summary description for Class1. /// </summary> class Class1 {  /// <summary>  /// The main entry point for the application.  /// </summary>  static int[] next=new int[20];  sta

KMP模式匹配算法概述

我们经常会遇到一种情况是匹配两个字符串,看strPar中是否含有str子串,如果有则返回子串在父串strPar中的位置,如果不存在则返回false. 很明显,我们可以通过暴力求解的方式解决该问题.即从strPar第一个字符和子串进行比较,若成功则返回第一个0,若不成功,再第二个字符开始比较,这样的时间复杂度为O(M*N).可以看出,这个复杂度是相当高的,那么我们有没有一种复杂度会降低呢?显然,有一种叫做KMP算法可以大大降低复杂度O(M+N).该算法通过记忆的方式,避免了很多无用功. 比如字符.

大话数据结构十一:字符串的模式匹配(KMP算法)

1. KMP算法简介: kmp算法是一种改进的字符串匹配算法,相比朴素算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程.这个哈希表被称为"部分匹配值表"(Particial match table),这种设计是KMP算法最精妙之处. 2. KMP算法分析: 下面以阮一峰老师博客中的一篇文章来分析KMP算法的原理:有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否

POJ 1961 C++ (KMP)

#include<iostream> using namespace std; int n,next[1000008]; char s[1000008]; void Get_next() {int j,k; j=1; k=0; next[1]=0; while(j<=n+1) { if(k==0 || s[j]==s[k]) { j++; k++; next[j]=k; } else k=next[k]; } } int main() { int i,cnt,k; freopen(&qu

字符串匹配的KMP算法

字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一.它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth. 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理解这种算法.下面,我用自己的语言

C# KMP算法字符串匹配

命题:设计算法,在字符串s中,从pos位置开始,查找第一个与目标字符串t相同的子字符串的起始位置. kmp算法实现:第一步,预处理目标字符串t,求出t中每一个字符在与源字符串s中字符不等时移到的位置.方法是根据如下公式 next[0]=-1; next[j]=max{k|0<k<j&&"t0t1...t(k-1)"=="t(j-k)t(j-k+1)...t(j-1)"}; next[j]=0; 此公式可如下证明 首先,假设目标字符串下一次

记录KMP算法,记录其经典之处

离开学校已经多年了,早已经不再抚弄那些陈旧的书籍. 周末,深圳的天气阴沉,老天这段时间总是很乐意显摆,动不动就给深圳人民来次几十年一遇的暴雨,似乎要把一年的雨水全部在这些天下完似的. 所以呆在家里面看电视,上网,实在也无聊.随手翻开大学时候的(数据结构,还留着啊,当初刚出来的时候总没有底气,总希望能够随时充电用).看到了字符串的模式匹配一章.突然发现KMP算法是如此的经典.故记之... 在提KMP的经典之前,首先要提基本的模式匹配算法: 所谓模式匹配,简单点说就是对两字符串进行匹配,找出一个字符

KMP模式匹配算法分析与实现

基本概念: 模式匹配是对字符串的一种非常重要的操作,假设被匹配的正文字符串是 text,模式串是pattern,则模式匹配的任务就是在text中找出所有的pattern, 给出pattern在text中的位置. 例如:text是"cdghcdghhcdr",pattern是"cd", 则答案是0,4,9(下标计数从0开始) 简单字符匹配: 第1轮: 用pattern的第1个字符与text的第1个字符比较,不等就结束,相等就 用pattern的第2个字符与text的第