题目描述

给出两个仅有小写字母组成的字符串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】的更多相关文章

  1. 【CZY选讲·Hja的棋盘】

    题目描述 Hja特别有钱,他买了一个×的棋盘,然后Yjq到这个棋盘来搞事.一开始所有格子都是白的,Yjq进行次行操作次列操作,所谓一次操作,是将对应的行列上的所有格子颜色取反.现在Yjq希望搞事之后 ...

  2. 【CZY选讲·吃东西】

    题目描述 一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间 ...

  3. 【CZY选讲·一道图论神题】

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...

  4. 【CZY选讲·最大子矩阵和】

    题目描述 有一个n*m的矩阵,恰好改变其中一个数变成给定的常数P,使得改变后的这个矩阵的最大子矩阵最大. 数据范围 n,m<=300. 题解:    ①如果没有p,那么二维矩阵和就是一维最长 ...

  5. 【CZY选讲·Yjq的棺材】

    题目描述 Yjq想要将一个长为宽为的矩形棺材(棺材表面绝对光滑,所以棺材可以任意的滑动)拖过一个L型墓道. 如图所示,L型墓道两个走廊的宽度分别是和,呈90°,并且走廊的长度远大于. 现在Hja ...

  6. 【CZY选讲·逆序对】

    题目描述 LYK最近在研究逆序对. 这个问题是这样的. 一开始LYK有一个2^n长度的数组ai. LYK有Q次操作,每次操作都有一个参数k.表示每连续2^k长度作为一个小组.假设 n=4,k= ...

  7. 【CZY选讲·Triangle】

    题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解:      ①相 ...

  8. 【CZY选讲·棋盘迷宫】

    题目描述 一个N*M的棋盘,’.’表示可以通过,’#’表示不能通过,给出Q个询问,给定起点和终点,判断两点是否联通,如联通输出“Yes”,否则输出“No”. 数据范围 N,M <=500,Q ...

  9. 【CZY选讲·次大公因数】

    题目描述 给定n个数ai,求sgcd(a1,a1),sgcd(a1,a2),…,sgcd(a1,an). 其中sgcd(x,y)表示x和y的次大公因数.若不存在次大公因数,sgcd(x,y)=-1 ...

随机推荐

  1. Nagios 监控Windows服务器(详细篇)

    1. 监控内容 windows服务器的内部参数包括以下 a. 内存使用状况 b. CPU负载 c. 磁盘使用状况 d. 服务状态 e. 运行的进程 2. 监控原理 在windows服务器内安装NSCl ...

  2. Logrotate实现Catalina.out日志每俩小时切割

    一.Logrotate工具介绍 Logrotate是一个日志文件管理工具,它是Linux默认自带的一个日志切割工具.用来把旧文件轮转.压缩.删除,并且创建新的日志文件.我们可以根据日志文件的大小.天数 ...

  3. ES6笔记02-箭头函数

    eg1:// ES5 匿名函数 var total = values.reduce(function (a, b) { return a + b; }, 0); // ES6 匿名函数 var tot ...

  4. [Codeforces976E]Well played!(贪心)

    [不稳定的传送门] Solution 首先可以证明,hp翻倍的操作一定是在同一个生物上最优 Code #include <cstdio> #include <algorithm> ...

  5. [CodeForces238E]Meeting Her(图论+记忆化搜索)

    Description 题目链接:Codeforces Solution 因为路线随机,所以找出各路线最短路必须经过的点,在这个点必定能上车 直接floyd暴力找割点 然后不断用k条公交车路线来更新D ...

  6. 笔记-scrapy-item

    笔记-scrapy-item 1.总述 爬虫数据保存用,一般情况下无需过多处理,引用并使用Field方法即可. 2.使用 常规使用: import scrapy class Product(scrap ...

  7. TouTiao开源项目 分析笔记18 视频详情页面

    1.效果预览 1.1.需要做到的真实效果 1.2.触发的点击事件 在MediaArticleVideoViewBinder的每一个item点击事件中: VideoContentActivity.lau ...

  8. WPF开发实例——仿QQ登录界面

    原文:WPF开发实例--仿QQ登录界面 版权声明:本文为博主原创文章,如需转载请标明转载地址 http://blog.csdn.net/u013981858 https://blog.csdn.net ...

  9. Struts2---环境搭建及包介绍

    导入jar包 jar包下载地址:http://www.apache.org/官网中选择struts,然后点击download下载.将jar包导入到WEB-INF下的lib文件目录下. asm-5.2. ...

  10. 找出Xcode没有使用的图片

    #! /bin/sh PROJ=`find . -name '*.xib' -o -name '*.[mh]'` for png in ` find . -name '*.png'` do name ...