题意:给定两个串,求出两个串的最长公共子序列,要求该公共子序列不包含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. Swift - 将String类型的数字转换成数字类型

    Swift中,如果要把字符串转换成数字类型(比如整型,浮点型等).可以先转成NSString类型,让后再转. 1 2 3 4 //将文本框中的值转换成数字 var i = (tf1.text as N ...

  2. 分分钟教会你使用HTML写Web页面

    在学习怎样使用HTML编写网页之前,我们必须先搞清楚什么是HTML?当然了不是系统的给大家介绍HTML的前世今生,假设对其身世感兴趣的小伙伴能够去问度娘,她会给你想要的答案. 所谓HTML,就是我们常 ...

  3. hdu1392 Surround the Trees 凸包

    第一次做凸包,这道题要特殊考虑下,n=2时的情况,要除以二才行. 我是从最左边的点出发,每次取斜率最大的点,一直到最右边的点. 然后从最左边的点出发,每次取斜率最低的点,一直到最右边的点. #incl ...

  4. BZOJ 2096([Poi2010]Pilots-单调队列-差值)

    2096: [Poi2010]Pilots Time Limit: 30 Sec   Memory Limit: 162 MB Submit: 190   Solved: 97 [ Submit][ ...

  5. How to get the source code of the chromium of the specified revision

    I'd like to get the source code of the chromium 34.0.1847.9. gclient config http://src.chromium.org/ ...

  6. Java 5种字符串拼接方式性能比较。

    最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,于是用Junit写了个单元测试. 代码如下: import java.util.ArrayList; import java.uti ...

  7. [置顶] 大量相关gis资源网盘打包下载

    详细请下载附件 所有资源下载(网盘下载): http://laoheitan.bego.cc arcgis教程: http://www.bego.cc/file/23322579 ENVI教程: ht ...

  8. 使用HashMap须要注意的事儿:不要暴露Map.entry给外部不可信代码Map.entrySet()

    Map/HashMap是java中一种非经常常使用的数据结构,一般我们在应用中做的事情就是调用put向容器写入数据或者是get从容器读取数据. Map.entrySet()这种方法返回了键值对的集合, ...

  9. Java使用Socket传输文件遇到的问题(转)

    1.写了一个socket传输文件的程序,发现传输过去文件有问题.找了一下午终于似乎找到了原因,记录下来警示一下: 接受文件的一端,向本地写文件之前使用Thread.sleep(time)休息一下就解决 ...

  10. 浅谈Swift语法

    Apple 在2014年6月的WWDC公布了一款新型的开发语言,很多美国程序猿的价值观貌似和我们非常大的不同,在公布的时候我们能够听到,场下的欢呼声是接连不断的.假设换作我们,特别是像有Objecti ...