Codeforces Round#201(div1) D. Lucky Common Subsequence
题意:给定两个串,求出两个串的最长公共子序列,要求该公共子序列不包含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的更多相关文章
- Codeforces Round #543 Div1题解(并不全)
Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...
- Codeforces Round #545 Div1 题解
Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个 ...
- Codeforces Round #539 Div1 题解
Codeforces Round #539 Div1 题解 听说这场很适合上分QwQ 然而太晚了QaQ A. Sasha and a Bit of Relax 翻译 有一个长度为\(n\)的数组,问有 ...
- [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
- Codeforces Round #201 (Div. 2) - C. Alice and Bob
题目链接:http://codeforces.com/contest/347/problem/C 题意是给你一个数n,然后n个数,这些数互不相同.每次可以取两个数x和y,然后可以得到|x - y|这个 ...
- Codeforces Round #253 DIV1 C 馋
http://codeforces.com/contest/442/problem/C 题意非常easy,基本上肯定有坑坑洼洼的样子.看题目案例,从第三个跟第二个没有凹的案例来看的话,多写几个以及多画 ...
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)
题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...
- Codeforces Round #117 (Div. 2) D.Common Divisors(KMP最小循环节)
http://codeforces.com/problemset/problem/182/D 题意:如果把字符串a重复m次可以得到字符串b,那么我们称字符串a为字符串b的一个因子,现在给定两个字符串S ...
- Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】
一 题面 C2. Increasing Subsequence (hard version) 二 分析 需要思考清楚再写的一个题目,不能一看题目就上手,容易写错. 分以下几种情况: 1 左右两端数都小 ...
随机推荐
- Linux系统基础命令
这是看itercast的学习笔记 Linux系统基础命令 日期时间 命令date用以查看.设置当前系统时间:格式化显示时间: +%Y--%m--%d 命令hwclock(clock)用以显示硬件时钟时 ...
- POJ 1273 Drainage Ditches(网络流,最大流)
Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover ...
- Swift - whose view is not in the window hierarchy 问题解决方法
问题现象:想在页面初始化的时候,使用self.presentViewController方法弹出个告警提示框UIAlertController.但行后报了个如下告警,同时告警框也出不来. 1 2015 ...
- android Activity切换动画效果
为Activity设置左右进出的效果,能够通过在Mainfest.xml文件里设置主题的方式来实现.还能够使用java代码. 一.设置样式 先看看实现动画的样式: <style name=&qu ...
- 手动配置S2SH三大框架报错(三)
十二月 08, 2013 10:24:43 下午 org.apache.catalina.core.AprLifecycleListener init 严重: An incompatible vers ...
- Android应用开发学习笔记之播放音频
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android支持常用音视频格式文件的播放,本文我们来学习怎样开发Android应用程序对音视频进行操作. Andr ...
- matlab画棋盘格程序
转载请注明出处:zhouyelihua**http://blog.csdn.net/zhouyelihua/article/details/46674191** 意义 在摄像机标定过程中经常须要打印棋 ...
- [ffmpeg 扩展第三方库编译系列] 关于须要用到cmake 创建 mingw32编译环境问题
我在这里给出我编译的样例 cmake -G"MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=& ...
- android 视频文件不能进行幻灯片的播放
packages\apps\Gallery2\src\com\android\gallery3d\app\SlideshowPage.java中: 1.加入: import com.android ...
- AIX下RAC搭建 Oracle10G(四)安装CRS
AIX下RAC搭建系列 AIX下RAC搭建Oracle10G(四)安装CRS 环境 节点 节点1 节点2 小机型号 IBM P-series 630 IBM P-series 630 主机名 AIX2 ...