首页 > ACM题库 > HDU-杭电 > hdu 2203 亲和串-KMP-[解题报告]C++
2014
01-04

hdu 2203 亲和串-KMP-[解题报告]C++

亲和串

问题描述 :

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

输入:

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

输出:

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

样例输入:

AABCD
CDAA
ASD
ASDF

样例输出:

yes
no

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N=100010;

char str1[N<<1],str2[N];
int next[N],flag;

void getnext(int len){      //获取字符串str2的next函数,标记
    int i=0,j=-1;
    next[0]=-1;
    while(i<len){
        if(j==-1 || str2[i]==str2[j]){
            i++;j++;
            next[i]=j;
        }else
            j=next[j];
    }
}

void KMP(int len1,int len2){    //KMP查找
    int i=0,j=0;
    getnext(len2);
    while(i<len1){
        if(j==-1 || str1[i]==str2[j]){
            i++;j++;
        }else
            j=next[j];
        if(j==len2){
            flag=1;
            break;
        }
    }
}

int main(){

    //freopen("input.txt","r",stdin);

    while(~scanf("%s%s",str1,str2)){
        int len1=strlen(str1);
        int len2=strlen(str2);
        if(len1<len2){
            puts("no");
            continue;
        }
        for(int i=0;i<len1;i++)
            str1[len1+i]=str1[i];
        flag=0;
        KMP(len1<<1,len2);
        if(flag)
            puts("yes");
        else
            puts("no");
    }
    return 0;
}

解题转自:http://www.cnblogs.com/jackge/archive/2013/01/05/2845981.html


,
  1. 我还有个问题想请教一下,就是感觉对于新手来说,递归理解起来有些困难,不知有没有什么好的方法或者什么好的建议?

  2. 嗯 分析得很到位,确实用模板编程能让面试官对你的印象更好。在设置辅助栈的时候可以这样:push时,比较要push的elem和辅助栈的栈顶,elem<=min.top(),则min.push(elem).否则只要push(elem)就好。在pop的时候,比较stack.top()与min.top(),if(stack.top()<=min.top()),则{stack.pop();min.pop();},否则{stack.pop();}.

  3. #include <cstdio>
    #include <algorithm>

    struct LWPair{
    int l,w;
    };

    int main() {
    //freopen("input.txt","r",stdin);
    const int MAXSIZE=5000, MAXVAL=10000;
    LWPair sticks[MAXSIZE];
    int store[MAXSIZE];
    int ncase, nstick, length,width, tmp, time, i,j;
    if(scanf("%d",&ncase)!=1) return -1;
    while(ncase– && scanf("%d",&nstick)==1) {
    for(i=0;i<nstick;++i) scanf("%d%d",&sticks .l,&sticks .w);
    std::sort(sticks,sticks+nstick,[](const LWPair &lhs, const LWPair &rhs) { return lhs.l>rhs.l || lhs.l==rhs.l && lhs.w>rhs.w; });
    for(time=-1,i=0;i<nstick;++i) {
    tmp=sticks .w;
    for(j=time;j>=0 && store >=tmp;–j) ; // search from right to left
    if(j==time) { store[++time]=tmp; }
    else { store[j+1]=tmp; }
    }
    printf("%dn",time+1);
    }
    return 0;
    }