题意:给定两个串,求出两个串的最长公共子序列,要求该公共子序列不包含virus串。

用dp+kmp实现

dp[i][j][k]表示以i结尾的字符串和以j结尾的字符串的公共子序列的长度(其中k表示该公共子序列的与virus的匹配程度)很显然,当k==strlen(virus)时,该公共子序列不是我们所求得

当添加一个字符时,如果失配,这时不能让k直接等于0,而是要用kmp给k一个合理的值。

 #include <stdio.h>
#include <string.h>
const int N = + ;
int dp[N][N][N];
int pre[N][N][N][];
char s1[N],s2[N],vir[N];
int next[N];
char ans[N];
void makeNext(int n)
{
next[] = -;
int i = ,j=-;
while(i < n)
{
if(j==- || vir[i] == vir[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
void DP(int x, int y, int z, int x1, int y1, int z1, int val)
{
if(dp[x][y][z] < dp[x1][y1][z1] + val)
{
dp[x][y][z] = dp[x1][y1][z1] + val;//状态转移
//保存路径
pre[x][y][z][] = x1;
pre[x][y][z][] = y1;
pre[x][y][z][] = z1;
}
}
int main()
{
int i,j,k;
scanf("%s%s%s",s1+,s2+,vir);
int len1 = strlen(s1+);
int len2 = strlen(s2+);
int len3 = strlen(vir);
memset(dp,,sizeof(dp));
memset(pre,-,sizeof(pre));
makeNext(len3);
for(i=; i<=len1; ++i)
for(j=; j<=len2; ++j)
{
for(k=; k<len3; ++k)
{
DP(i,j,k,i-,j,k,);//s1[i] != s2[j]时的转移
DP(i,j,k,i,j-,k,);
if(s1[i] == s2[j])//s1[i] == s2[j]
{
if(s1[i] == vir[k])
{
DP(i,j,k+,i-,j-,k,);
}
else
{
int p = next[k];
while(p!=- && s1[i] != vir[p]) p = next[p];
if(p==-)
p = ;
if(s1[i] == vir[p])
DP(i,j,p+,i-,j-,k,);
else
DP(i,j,p,i-,j-,k,);
}
}
}
}
int z;
int Max = -;
for(k=; k<len3; ++k)
if(Max < dp[len1][len2][k])
{
Max = dp[len1][len2][k];
z = k;
}
if(Max <= )
printf("0\n");
else//根据路径求出最长公共子序列
{
int tMax = Max;
int x = len1,y = len2;
while(pre[x][y][z][] != -)
{
int xx = pre[x][y][z][];
int yy = pre[x][y][z][];
int zz = pre[x][y][z][];
if(x-xx== && y-yy==&&s1[x] == s2[y])
ans[Max--] = s1[x];
x = xx;y=yy;z=zz;
}
for(i=; i<=tMax; ++i)
printf("%c",ans[i]);
printf("\n");
}
}

Codeforces Round#201(div1) D. Lucky Common Subsequence的更多相关文章

  1. Codeforces Round #543 Div1题解(并不全)

    Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...

  2. Codeforces Round #545 Div1 题解

    Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...

  3. Codeforces Round #539 Div1 题解

    Codeforces Round #539 Div1 题解 听说这场很适合上分QwQ 然而太晚了QaQ A. Sasha and a Bit of Relax 翻译 有一个长度为\(n\)的数组,问有 ...

  4. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  5. Codeforces Round #201 (Div. 2) - C. Alice and Bob

    题目链接:http://codeforces.com/contest/347/problem/C 题意是给你一个数n,然后n个数,这些数互不相同.每次可以取两个数x和y,然后可以得到|x - y|这个 ...

  6. Codeforces Round #253 DIV1 C 馋

    http://codeforces.com/contest/442/problem/C 题意非常easy,基本上肯定有坑坑洼洼的样子.看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画 ...

  7. Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)

    题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...

  8. Codeforces Round #117 (Div. 2) D.Common Divisors(KMP最小循环节)

    http://codeforces.com/problemset/problem/182/D 题意:如果把字符串a重复m次可以得到字符串b,那么我们称字符串a为字符串b的一个因子,现在给定两个字符串S ...

  9. Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】

    一 题面 C2. Increasing Subsequence (hard version) 二 分析 需要思考清楚再写的一个题目,不能一看题目就上手,容易写错. 分以下几种情况: 1 左右两端数都小 ...

随机推荐

  1. Greenplum同步到Oracle

    开发提出须要从Greenplum同步到Oracle的解决方式,写了个脚本用于定时调度处理. #!/bin/sh #copy_gp_2_ora.sh if [ $# -ne 1 ]; then     ...

  2. C++ 载入dll

    1.新建一个项目生成dll 首先我们新建一个项目生成一个Dynamic Library(动态链接库) dll 里面非常简单,只有一个add方法.等下我们就要在其他项目里尝试载入这个dll,调用里面的这 ...

  3. Jexus web server V5.6.1正式公布

    Jexus v5.6.1已经正式公布,下载和技术支持站点是 www.linuxdot.net. 该版开发时间历时11个月,后期直接在大流量生产环境中进行调试和优化,其正确性.稳定性.大并发承载能力.A ...

  4. Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例

    1,加速传感器可以监听到x,y,z三个方向的加速度,使用步骤如下: (1)实例化CMMotionManager类 (2)向CMMotionManager的accelerometerUpdateInte ...

  5. C语言之基本算法35—数组上三角之积 主对角之积 副对角之积

    //数组算法 /* ============================================================= 题目:求四阶矩阵上三角之积.主对角之积,副对角之积: 如 ...

  6. Android消息循环分析

    我们的经常使用的系统中,程序的工作一般是有事件驱动和消息驱动两种方式,在Android系统中,Java应用程序是靠消息驱动来工作的. 消息驱动的原理就是: 1. 有一个消息队列.能够往这个队列中投递消 ...

  7. 基于SIFT+Kmeans+LDA的图片分类器的实现

    原地址:http://www.cnblogs.com/freedomshe/archive/2012/04/24/2468747.html 题记:2012年4月1日回到家,南大计算机研究僧复试以后,等 ...

  8. Config File Settings Of EF——实体框架的配置文件设置

    我亦MSDN 原文地址 http://msdn.microsoft.com/en-us/data/jj556606 Entity Framework allows a number of settin ...

  9. 做SEO所要具备的四种能力

    1,不为失败找借口         既然我们选择了做SEO,那么发生网站被降权.被K是常常的事.当这样的情况发生时,大部分站长首先将责任推给百度机制,由于百度更新算法调整遭降权,不是由于他们的优化没有 ...

  10. hdu2063+hdu1083(最大匹配数)

    传送门:hdu2063过山车 #include <cstdio> #include <cstring> #include <string> #include < ...