LCS修改版(Longest Common Subsequence 最长公共子序列)
题目描述
作为一名情报局特工,Nova君(2号)有着特殊的传达情报的技巧。为了避免被窃取情报,每次传达时,他都会发出两句旁人看来意义不明话,实际上暗号已经暗含其中。解密的方法很简单,分别从两句话里删掉任意多个字母,使得两句话剩余的部分相同,通过一定的删除手法,可以让剩余的部分相同且长度最大,就得到了可能的暗号。暗号可能有多个,还要进行筛选,现在情报局人手不够,希望你能助一臂之力,筛选工作不用你完成,你只需计算出暗号长度以及个数即可。(注意,字母的位置也是暗号的重要信息,位置不同的字母组成的暗号不算同一种,详见样例)
输入
多组测试数据(组数小于20)
每组数据输入两行,分别为两个字符串(只含英文字母,无空格),每个字符串以"." 结束
输出
对于每组数据,输出两行,第一行为暗号的长度,第二行为暗号的个数(答案可能很大,对个数100000000求模)
输入样例
AAAA.
AA.
输出样例
2
题目来源:http://biancheng.love/contest/17/problem/F/index最长公共子序列的实现可参考:http://www.cnblogs.com/huangxincheng/archive/2012/11/11/2764625.html和之前的不同在于需要计算出最长公共子序列一共有多少个!翻看不少博客很少有提到计算最长公共子序列的个数问题
6
下面给出代码实现:
#include <bits/stdc++.h>
using namespace std; const int m=;//对m求模
int f[][]= {},g[][]= {}; int main()
{
string s1,s2;
while(cin>>s1>>s2)
{
memset(f,,sizeof(f));
memset(g,,sizeof(g));
int len1=s1.size()-,len2=s2.size()-;//串s1,s2长度 for(int i=; i<=len2; i++)
g[][i]=;
int k;
for(int i=; i<=len1; i++)
{
k=i & ;//与运算 当i是奇数时k=1,当i时偶数是k是0
memset(g[k],,sizeof(g[k]));
memset(f[k],,sizeof(f[k]));
g[k][]=;
g[!k][]=;
for(int j=; j<=len2; j++)
{
if(s1[i-]==s2[j-])
{
f[k][j]=f[!k][j-]+;
g[k][j]=g[!k][j-];
g[k][j]%=m;
if(f[k][j]==f[!k][j])
{
g[k][j]+=g[!k][j];
g[k][j]%=m;
}
if(f[k][j-]==f[k][j])
{
g[k][j]+=g[k][j-];
g[k][j]%=m;
}
}
else
{
if(f[!k][j]>f[k][j-])
{
f[k][j]=f[!k][j];
g[k][j]+=g[!k][j];
g[k][j]%=m;
}
if(f[!k][j]<f[k][j-])
{
f[k][j]=f[k][j-];
g[k][j]+=g[k][j-];
g[k][j]%=m;
}
if(f[!k][j]==f[k][j-])
{
f[k][j]=f[!k][j];
g[k][j]+=g[!k][j]+g[k][j-];
if(f[!k][j-]==f[k][j])g[k][j]-=g[!k][j-];
g[k][j]=(g[k][j]+*m)%m;
}
}
}
}
cout<<f[k][len2]<<endl;
cout<<g[k][len2]<<endl;
}
}
LCS修改版(Longest Common Subsequence 最长公共子序列)的更多相关文章
- lintcode 77.Longest Common Subsequence(最长公共子序列)、79. Longest Common Substring(最长公共子串)
Longest Common Subsequence最长公共子序列: 每个dp位置表示的是第i.j个字母的最长公共子序列 class Solution { public: int findLength ...
- LCS(Longest Common Subsequence 最长公共子序列)
最长公共子序列 英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...
- LCS(Longest Common Subsequence)最长公共子序列
最长公共子序列(LCS)是一个在一个序列集合中(通常为两个序列)用来查找所有序列中最长子序列的问题.这与查找最长公共子串的问题不同的地方是:子序列不需要在原序列中占用连续的位置 .最长公共子序列问题是 ...
- C++版 - Lintcode 77-Longest Common Subsequence最长公共子序列(LCS) - 题解
版权声明:本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C++版 - L ...
- POJ 1458 Common Subsequence(最长公共子序列LCS)
POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列 ...
- HDU 1159 Common Subsequence 最长公共子序列
HDU 1159 Common Subsequence 最长公共子序列 题意 给你两个字符串,求出这两个字符串的最长公共子序列,这里的子序列不一定是连续的,只要满足前后关系就可以. 解题思路 这个当然 ...
- hdu 1159 Common Subsequence(最长公共子序列 DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- POJ 1458 Common Subsequence 最长公共子序列
题目大意:求两个字符串的最长公共子序列 题目思路:dp[i][j] 表示第一个字符串前i位 和 第二个字符串前j位的最长公共子序列 #include<stdio.h> #include&l ...
- POJ 1458 Common Subsequence 最长公共子序列 LCS
LCS #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> ...
随机推荐
- 敏捷个人微信号:AgileMe ,欢迎大家推广和关注
- Enum Helper
public static class EnumHelper { #region get /// <summary> /// 获得枚举类型所包含的全部项的列表 /// </summa ...
- Gradle学习系列之一——Gradle快速入门
这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构 ...
- C#全角转换成半角并检查
新建一个项目quanbanjiao,在此项目下新建一个类Class1 using System; using System.Web; using System.Text; namespace quan ...
- Java知识点总结(不定时更新)
1.基于分代的垃圾收集算法 设计思路:把对象按照寿命长短来分组,分为年轻代和年老代,新创建的对象被分在年轻代,如果对象经过几次回收后仍然存活,那么再把这个对象划分到年老代.年老代的收集频率不像年轻代那 ...
- Windows nexus 启动失败
现象: nexus Windows系统服务安装成功,但启动失败 D:\nexus-2.10.0-02-bundle\nexus-2.10.0-02\bin>nexus.bat Usage: ne ...
- 小白学Linux(四)--系统常用命令
这里记录一下基础的系统常用命令,都是日常可能用到的,需要记住的一些命令.主要分为5个模块:关于时间,输出/查看,关机/重启,压缩归档和查找. 时间: date :查看设置当前系统时间,dat ...
- linux下导入、导出mysql数据库命令 下载文件到本地
一.下载到本地 yum install lrzsz sz filename 下载 rz filename 上传 linux下导入.导出mysql数据库命令 一.导出数据库用mysqldump命 ...
- mongodb学习3---mongo的MapReduce
1,概述MapReduce是个非常灵活和强大的数据聚合工具.它的好处是可以把一个聚合任务分解为多个小的任务,分配到多服务器上并行处理.MongoDB也提供了MapReduce,当然查询语肯定是Java ...
- javascript 之注意url特殊字符限制
引子 浏览器URl地址,上网一定会用到,但是浏览器地址有中文或者浏览器url参数操作的时候,经常会用到encodeURIComponent()和decodeURIComponent()以及encode ...