zoukankan      html  css  js  c++  java
  • HDU2203

    人随着岁数的增长是越大越聪明还是越大越笨,这是一个值得全世界科学家思考的问题,同样的问题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

    思路:这道题也比较简单,KMP模板题

    #include <iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    const int maxn=1000010;
    char str[maxn],pat[maxn],s[maxn];//pat为模式串,str为主串
    int Next[maxn]; //Next[x]下标x表示匹配失败处字符下标
    //模式串pat的前缀与x位置的后缀的最大匹配字符个数-1
    void GetNext(char *pat)
    {
        int LenPat = strlen(pat);
        int i = 0,j = -1;
        Next[0] = -1;
        while(i < LenPat)
        {
            if(j == -1 || pat[i] == pat[j])
            {
                i++,j++;
                Next[i] = j;
            }
            else
                j = Next[j];
        }
    }
    
    int KMP()//返回模式串pat在str中第一次出现的位置
    {
        int LenStr = strlen(s);
        int LenPat = strlen(pat);
        if(LenPat>LenStr)
            return -1;
        memcpy(str,s,sizeof(s));
        strcat(str,s);
        LenStr=strlen(str);
        GetNext(pat);
        int i = 0,j = 0;
        int ans = 0;//计算模式串在主串匹配次数
        while(i < LenStr)
        {
            if(j == -1 || str[i] == pat[j])
                i++,j++;
            else
                j = Next[j];
            if(j == LenPat)
            {
                //ans++;// ans存放匹配次数,去掉return,最后返回ans
                return i - LenPat + 1;
            }
        }
        return -1;//没找到匹配位置
        //return ans;//返回匹配次数。
    }
    int main()
    {
    
        while(~scanf("%s%s",s,pat))
        {
    
            int i=KMP();
            //cout<<str;
            //cout<<s;
            if(i==-1)
                printf("no
    ");
            else
                printf("yes
    ");
        }
    }
  • 相关阅读:
    JavaOOP对象和封装
    使用socket实现文件复制
    多线程模拟银行取款
    初入多线程示例展示--Runner
    初步学习多线程3
    初步学习多线程2
    初步线程学习1
    守护线程_setDaemon()
    多线程_yield()和sleep()方法比较
    java_多线程_优先级
  • 原文地址:https://www.cnblogs.com/aerer/p/9931016.html
Copyright © 2011-2022 走看看