hdu1867KMP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1867

题意(重要):给两个字符串,要求串1后缀+本身和串2前缀+本身能有重叠的就省略输出,或者串2后缀和串1前缀;如果两种情况得到的字符串长度相等,就输出字典序小的一个;

注意就是asdf 和sdfg,或者sdfg和asdf 都会得到asdfg;

做这道题在同学已经告诉我题意的情况下我还做错了N多次。。。才发现全局变量原来也是有局限性。。。。用在该用的地方。。。

AC代码(好不容易啊。。):

#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100000+10;
void getnext(char *b,int l2,int *next)
{
    memset(next,0,sizeof(next));
    int i=0,j=-1;
    next[0]=-1;
    while(i<l2)
    {
        if(j==-1||b[i]==b[j])
        {
            i++,j++;
            next[i]=j;
        }
        else j=next[j];
    }
}
int kmp(char *a,char *b,int l1,int l2)
{
    
    int next[maxn];
    getnext(b,l2,next);
    int i=0,j=0;
    while(i<l1)
    {
        if(j==-1||a[i]==b[j])
            i++,j++;
        else j=next[j];
    }
    return i-j;
}
int main()
{
    int len1,len2;
    char s1[maxn],s2[maxn],s3[maxn*2],s4[maxn*2];
    while(scanf("%s%s",&s1,&s2)!=EOF)
    {
        memset(s3,0,sizeof(s3));
        memset(s4,0,sizeof(s4));
        len1=strlen(s1);
        len2=strlen(s2);
        int k1=kmp(s1,s2,len1,len2);
        int k2=kmp(s2,s1,len2,len1);
//        printf("%d %d\n",k1,k2);
        for(int i=0;i<k1;i++)
            s3[i]=s1[i];
        strcat(s3,s2);
        for(int i=0;i<k2;i++)
            s4[i]=s2[i];
        strcat(s4,s1);
//        printf("%s\n%s\n",s3,s4);
        len1=strlen(s3);
        len2=strlen(s4);
        if(len1<len2)printf("%s\n",s3);
        else if(len2<len1)printf("%s\n",s4);
        else
        {
            if(strcmp(s3,s4)<0)printf("%s\n",s3);
            else printf("%s\n",s4);
        }0
    }
    return 0;
}

 

posted @ 2013-08-19 22:33  拼搏今朝 努力奋进  阅读(196)  评论(0)    收藏  举报