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 左右两端数都小 ...
随机推荐
- 使用 Nginx 创建服务器的负载均衡
译序 Nginx 的负载均衡配置看上去很简单.以下是 Nginx 官方给的一个简单的负载均衡的例子: http { upstream myproject { server ...
- Delphi访问活动目录
活动目录Active Directory是用于Windows Server的目录服务,它存储着网络上各种对象的有关信息,并使该信息易于管理员和用户查找及使用.Active Directory使用结构化 ...
- 深度RAMOS,把操作系统全部安装在内存上
你看下深度RAMOS就知道了 RAMOS+音速启动+绿色软件+云端 很爽 http://www.shenduwin7.com/jiaocheng/52.html
- C++ map
C++ map Map is an associative container that contains a sorted list of unique key-value pairs. That ...
- 联想A800新蜂ROM V1.1 基于官方4.0.4精简省电稳定
ROM介绍 [出品]:新蜂工作室(基于官方) 1.源于官方:基于最稳定官方底包制作. 2.深度精简:自带APK数量从原厂包的131个降低到90个,精简31% 3.ROM包大小从原厂314MB精简到16 ...
- java中synchronized的使用方法与具体解释
Java语言的keyword.当它用来修饰一个方法或者一个代码块的时候,可以保证在同一时刻最多仅仅有一个线程运行该段代码. 一.当两个并发线程訪问同一个对象object中的这个synchronized ...
- c#indexof使用方法
IndexOf() 查找字串中指定字符或字串首次出现的位置,返首索引值,如: str1.IndexOf("字"): //查找"字"在str1中的索引值(位置) ...
- 如何设置lmt的空间警告阀值
Example—设置Locally Managed Tablespace的空间警告阀值 The following example sets the free-space-remaining thre ...
- SQL ---指令实例语句
1 1 create database+数据库名字 创建数据库 2 2 create table+表的名字 创建表 3 表中的操作: 4 3 insert into 表名 (列名1,列名2··)val ...
- ios 正則表達式替换
1. 不可变字符串 (content 是不可变) NSRegularExpression *regularExpression = [NSRegularExpression regularExpr ...