【CZY选讲·扩展LCS】
题目描述
给出两个仅有小写字母组成的字符串str1 和str2,试求出两个串的最长公共子序列。
数据范围
|str1| ⩽ 1000; |str2| ⩽ 10^6
题解:
①直接进行LCS(或者nlogn优化)爆炸了、
②尝试利用本体特点:|str1|很小。
③相当于答案不超过1000,那么就将数组下标和所存的东西调换,得到:
f[i][j]表示匹配到s1[i],公共子序列长度为j时,s2匹配到的最小的位置。
再记录next[i][j]表示当前在s2的i位置,下一个j字母出现的位置。
转移方程:f[i+1][j]=min(f[i+1][j],f[i][j]) f[i+1][j+1]=min(f[i+1][j+1],next[f[i][j]+1][a[i+1]-'a'])
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cmath>
#include <string>
#include <cstring> #define st first
#define nd second
using namespace std; typedef long long LL; const int N = 1010;
const int M = 1E6 + 10;
const int INF = 1E9;
char a[N];
char b[M];
int f[N][N];
int nxt[M][26];
int n, m; void solve() {
f[0][1] = nxt[0][a[0] - 'a'];
for (int i = 0; i <= n; ++i) f[i][0] = -1;
for (int i = 0; i < n - 1; ++i)
for (int j = 0; j <= n && f[i][j] < INF; ++j) {
f[i + 1][j] = min(f[i + 1][j], f[i][j]);
if (j < n)
f[i + 1][j + 1] = min(f[i + 1][j + 1], nxt[f[i][j] + 1][a[i + 1] - 'a']);
}
} int main() {
freopen("lcs.in", "r", stdin);
freopen("lcs.out", "w", stdout);
scanf("%s%s", a, b);
n = strlen(a);
m = strlen(b);
for (int i = 0; i <= n; ++i)
for (int j = 0; j <= n; ++j)
f[i][j] = INF;
for (int i = 0; i < 26; ++i)
nxt[m][i] = INF;
for (int i = m - 1; i >= 0; --i) {
memcpy(nxt[i], nxt[i + 1], sizeof(nxt[i]));
nxt[i][b[i] - 'a'] = i;
}
solve();
int ans = 0;
for (int i = n; i; --i)
if (f[n - 1][i] < INF) {
ans = i;
break;
}
printf("%d\n", ans);
}//czy020202
在撒满鲜血的天空迎着风飞舞,凭着一颗永不哭泣勇敢的心。————汪峰《勇敢的心》
【CZY选讲·扩展LCS】的更多相关文章
- 【CZY选讲·Hja的棋盘】
题目描述 Hja特别有钱,他买了一个×的棋盘,然后Yjq到这个棋盘来搞事.一开始所有格子都是白的,Yjq进行次行操作次列操作,所谓一次操作,是将对应的行列上的所有格子颜色取反.现在Yjq希望搞事之后 ...
- 【CZY选讲·吃东西】
题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...
- 【CZY选讲·一道图论神题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...
- 【CZY选讲·最大子矩阵和】
题目描述 有一个n*m的矩阵,恰好改变其中一个数变成给定的常数P,使得改变后的这个矩阵的最大子矩阵最大. 数据范围 n,m<=300. 题解: ①如果没有p,那么二维矩阵和就是一维最长 ...
- 【CZY选讲·Yjq的棺材】
题目描述 Yjq想要将一个长为宽为的矩形棺材(棺材表面绝对光滑,所以棺材可以任意的滑动)拖过一个L型墓道. 如图所示,L型墓道两个走廊的宽度分别是和,呈90°,并且走廊的长度远大于. 现在Hja ...
- 【CZY选讲·逆序对】
题目描述 LYK最近在研究逆序对. 这个问题是这样的. 一开始LYK有一个2^n长度的数组ai. LYK有Q次操作,每次操作都有一个参数k.表示每连续2^k长度作为一个小组.假设 n=4,k= ...
- 【CZY选讲·Triangle】
题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解: ①相 ...
- 【CZY选讲·棋盘迷宫】
题目描述 一个N*M的棋盘,’.’表示可以通过,’#’表示不能通过,给出Q个询问,给定起点和终点,判断两点是否联通,如联通输出“Yes”,否则输出“No”. 数据范围 N,M <=500,Q ...
- 【CZY选讲·次大公因数】
题目描述 给定n个数ai,求sgcd(a1,a1),sgcd(a1,a2),…,sgcd(a1,an). 其中sgcd(x,y)表示x和y的次大公因数.若不存在次大公因数,sgcd(x,y)=-1 ...
随机推荐
- datatable 单元格默认文本
在列字段中添加属性:"defaultContent": "-"
- gdb-pada调试实例
先编写个简单的hello的程序 hello.c (ps:有没有头文件行不行,试试不就知道了) int main(){ printf("hello!\n"); int m,n; in ...
- linux特殊权限位suid
特殊权限位基本说明(了解): linux系统基本权限位为9位权限,但还有额外3位权限位,共12位权限: suid s(x) S 4 用户对应的权限位(用户对应的3位 ...
- dts--tests(三)
sample_built.py """ DPDK Test suite. Test sample_built. """ import uti ...
- C# WPF使一个窗口挡在最前面,且不处理此窗口就不能点击其他窗口
模态框弹出就可以了.窗口用ShowDialog调用. 可以在子窗体里把WindowStartupLocation设置为CenterOwner, 让子窗体在MainWindow的中心位置显示
- C语言数组篇(四)二维数组
二维数组声明: ][] ={{,,},{,,}; //两行 三列 二维数组在声明的时候可以不写行,但一定要写列 ] = {{,},{,,},{}}; //未声明的地方自动补零 二维 ...
- P2567 [SCOI2010]幸运数字 DFS+容斥定理
P2567 [SCOI2010]幸运数字 题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,66 ...
- Hadoop(初始Hadoop)
Hadoop核心组件 1.Hadoop生态系统 Hadoop具有以下特性: 方便:Hadoop运行在由一般商用机器构成的大型集群上,或者云计算服务上 健壮:Hadoop致力于在一般商用硬件上运行,其架 ...
- NPM安装vue-cli,并创建vue+webpack项目模板
1.安装npm npm 是node.js 的包管理工具, 安装流程地址:https://docs.npmjs.com/cli/install 估计会非常慢,我们可以使用淘宝NPM镜像下载安装:htt ...
- 3 破解密码,xshell连接
1.破解root密码 (1)启动电脑,按上下键进入启动菜单界面,选择第二个Red Hat Enterprise Linux Server, with Linux 0-rescue-* (2)按 'e' ...