首页 > 其他 > 详细

codeforces 25 E Test KMP

时间:2016-03-28 13:41:46      阅读:254      评论:0      收藏:0      [点我收藏+]

题意:求一个最短字符串包含所给的三个子串,输出最短长度

思路:用KMP求出任意两个子串的前缀和后缀公共部分的最大长度

#include <cstdio>
#include <cmath>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int len[4],d[4][4];
char s[4][200005];
int Next[300005];
int KMP(char s[],int len)
{
    int n=strlen(s),i,j;
    memset(Next,0,sizeof(Next));
    for(i=1;i<n;i++)
    {
        j=Next[i-1];
        while(j>0&&s[i]!=s[j]) j=Next[j-1];
        if(s[i]==s[j]) j++;
        Next[i]=j;
        if(j==len) return len;
    }
    return Next[n-1];
}
int main()
{
    int i,j,k,m,n,ans;
    while(~scanf(" %s",s[1]))
    {
        memset(d,0,sizeof(d));
        scanf(" %s",s[2]);
        scanf(" %s",s[3]);
        len[1]=strlen(s[1]);
        len[2]=strlen(s[2]);
        len[3]=strlen(s[3]);
        for(i=1;i<=3;i++)
        {
            for(j=1;j<=3;j++)
            {
                if(i==j) continue;
                memset(s[0],0,sizeof(s[0]));
                strcpy(s[0],s[i]);
                s[0][len[i]]=#;
                strcat(s[0],s[j]);
                d[i][j]=KMP(s[0],len[i]);
            }
        }
        ans=999999999;
        for(i=1;i<=3;i++)
        {
            for(j=1;j<=3;j++)
            {
                for(k=1;k<=3;k++)
                {
                    if(i==j||i==k||j==k) continue;
                    int tp=len[i]+len[j]+len[k]-d[i][j];
                    if(d[i][j]==len[i]) tp-=d[k][j];
                    else tp-=d[k][i];
                    ans=min(ans,tp);
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

codeforces 25 E Test KMP

原文:http://www.cnblogs.com/zuferj115/p/5328640.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!