hdu 1841 Find the Shortest Common Superstring

hdu 1841 点击打开链接


题意:给出两个字符串s1,s2,找到一个最短的字符串s,使得s1是它的子串,s2也是它的字串。

方法:用KMP,首先判断s1是否是s2的字串,若是,则直接输出s2的长度,,即s2就是我们找的s字符串。同理判断s2是否是s1 的字串。

若都不是,,则判断s1 的前缀与s2的后缀最大重合部分k1,s2的前缀与s1后缀最大重合部分k2,判断k1与k2的大小,然后用s1的长度加s2的长度减去k1,k2中较大者。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
#define maxn  1000009
char a[maxn];
char b[maxn];
int next[maxn];
void get_next(char *a)
{
    int i=0,j=-1;
    next[0] = -1;
    while( a[i] )
    {
        if(j == -1 || a[i]==a[j])
        {
            if(a[++i]!=a[++j]) next[i] = j;
            else next[i] = next[j];
        }else j = next[j];
    }
}
int KMP(char *a,char *b)///用a的前缀去匹配b的后缀
{
    int i=0,j=0,lena = strlen(a),lenb = strlen(b);
    get_next(a);
    while(j < lenb && i < lena )
    {
        if(i==-1 || a[i]==b[j]) ++i,++j;
        else i = next[i];
    }
    if(i>=lena) return -3;
    else return i;
}
int main()
{
    int T;cin>>T;
    while(T--){
        scanf("%s%s",a,b);
        int k1 = KMP(a,b);
        int k2 = KMP(b,a);
        if(k1==-3) printf("%d\n",strlen(b));
        else if(k2==-3) printf("%d\n",strlen(a));
        else {
         printf("%d\n",strlen(a)+strlen(b)-max(k1,k2));
        }
    }return 0;
}


这是我发表的第一篇KMP,因为刚学的时候自己都不怎么了解KMP,,不敢误人子弟啊。。


你可能感兴趣的:(KMP)