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> ...
随机推荐
- bootstrap插件学习-bootstrap.scrollspy.js
先看bootstrap.dropdown.js的结构 function ScrollSpy(){} //构造函数 ScrollSpy.prototype = {} //构造器的原型 $.fn.scro ...
- Mysql大量插入随机数据方法--存储过程
创建测试表: mysql)); 创建存储过程: mysql> delimiter // mysql> create procedure rand_data(in num int) -> ...
- EF增删查改(三)------终极版
1.Add #region 1.1 新增学生信息(定义成Int类型,返回受影响的行数) /// <summary> /// 新增学生信息 /// </summary> /// ...
- Linq专题之Lambda表达式
这一节我们讲的Lambda表达式跟匿名函数有关.Lambda表达式就是一个匿名函数,它可以包含表达式和语句,并且可以创建委托和表达式树. Lambda表达式的组成: 输入参数.Lambda运算符(=& ...
- 有关CLR的初学小整理(可能理解不深刻,望大牛指出)
1. .Net程序通过CLR去加载运行管理代码, 加载CLR的进程成为“宿主”,通常操作系统加载. 加载CLR的进程也可以为某个DLL,也成为“宿主” 2. 宿主接口使宿主能够对运行库的更多方面进行控 ...
- Aspose.Words.Tables.Row类操作word表格行
http://www.aspose.com/docs/display/wordsnet/Aspose.Words.Tables.Row+Class Retrieves the index of a r ...
- 查询自己电脑的IP
1.怎样查询电脑的IP 1)运用dos命令 在运行窗体上输入cmd,进入dos命令窗体,输出ipconfig/all命令,找到自己的IP地址 上面所圈出的就是本机IP地址 2) 进入“网络和共享中心” ...
- 我的HTML笔记
HTML(Hypertext Marked Language)"超文本标记语言". 1.HTML的声明 <!DOCTYPE html> 2.HTML的基本结构 < ...
- jquery 拓展
1. 概述 jquery允许拓展自定义的方法, 绑定到$.fn对象上, 编写一个jQuery插件的原则: 给$.fn绑定函数,实现插件的代码逻辑: 插件函数最后要return this;以支持链式调用 ...
- 通过NameValuePairsValueProvider对象来获取指定前缀的Key
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http.ValueProvid ...