纪中DAY1 2021.07.12【NOIP提高A组】模拟
时间:2021-07-12
本文章向大家介绍纪中DAY1 2021.07.12【NOIP提高A组】模拟,主要包括纪中DAY1 2021.07.12【NOIP提高A组】模拟使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
T1 【GDOI 2016 Day1】第二题 最长公共子串
题意
求S串和T串的最长公共子串,不同的是S串中有k个区间的字母可以重拍,且不限次数。
思路
容易发现区间交叉可以合并,这样最多有2000个区间。
然后dp。
设f[i][j]为以S串的第i个区间开头,以T串的第j个字母开头的最长公共子串。
对于区间i,判断是否可以与[j~j+len)匹配(前缀和优化)。
如果全部匹配,则f[i][j] = len + f[i + 1][j + len](即可以与i+1的区间接上);
否则f[i][j] = len(无法接上)。
另外对于左边,可能有部分的子串可以匹配,暴力判断即可。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
struct node {
int l, r, len;
}a[100002], b[2001];
int m, n, k, cnt, ans;
int f[2001][2001], pre[2001][27], tmp[27];
char t[2001], s[2001];
bool cmp(node x, node y) {
return x.l == y.l ? x.r > y.r : x.l < y.l;
}
int main() {
freopen("lcs.in", "r", stdin);
freopen("lcs.out", "w", stdout);
scanf("%s", t + 1);
scanf("%s", s + 1);
m = strlen(t + 1);
n = strlen(s + 1);
scanf("%d", &k);
for (int i = 1; i <= k; i++)
scanf("%d %d", &a[i].l, &a[i].r), a[i].l++, a[i].r++;
std::sort(a + 1, a + k + 1, cmp);
a[k + 1] = (node){n + 1};
int st = a[1].l, ed = a[1].r;
for (int i = 1; i < st; i++)
b[++cnt] = (node){i, i, 1};
for (int i = 1; i <= k + 1; i++)
if (a[i].l <= ed)
ed = std::max(ed, a[i].r);
else {
b[++cnt] = (node){st, ed, ed - st + 1}, st = a[i].l, ed = a[i].r;
for (int j = b[cnt].r + 1; j < a[i].l; j++)
b[++cnt] = (node){j, j, 1};
}
for (int i = 1; i <= n; i++) {
pre[i][s[i] - 96]++;
for (int j = 1; j <= 26; j++)
pre[i][j] += pre[i - 1][j];
}
int flag;
for (int i = cnt; i >= 1; i--)
for (int j = m; j >= 1; j--) {
memset(tmp, 0, sizeof(tmp));
flag = 0;
for (int l = j; l < j + b[i].len && l <= m; l++) {
if (tmp[t[l] - 96] == pre[b[i].r][t[l] - 96] - pre[b[i].l - 1][t[l] - 96]) {
f[i][j] = l - j;
flag = 1;
break;
}
tmp[t[l] - 96]++;
}
if (!flag && j + b[i].len <= m)
f[i][j] = b[i].len + f[i + 1][j + b[i].len];
memset(tmp, 0, sizeof(tmp));
flag = 0;
for (int l = j - 1; l > j - b[i - 1].len && l >= 1; l--) {
if (tmp[t[l] - 96] == pre[b[i - 1].r][t[l] - 96] - pre[b[i - 1].l - 1][t[l] - 96])
break;
tmp[t[l] - 96]++;
flag++;
}
ans = std::max(f[i][j] + flag, ans);
}
printf("%d", ans);
}
原文地址:https://www.cnblogs.com/HSZGB/p/15004177.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- DEapp(差异表达分析)本地版——自由飞翔
- 盘一盘Tidyverse| 筛行选列之select,玩转列操作
- 2-14 |“特殊”的日子,多学一种表达爱的方式
- 盘一盘Tidyverse| 只要你要只要我有-filter 筛选行
- RNA相互作用神器——ENCORI
- R|tableone 快速绘制文章“表一”-基线特征三线表
- R-apply| 基因表达量批量二分类,Get!(修正版)
- TCGAbiolinks获取癌症临床信息
- R-rbind.fill|列数不一致的多个数据集“智能”合并,Get!
- R-ggpmisc|回归曲线添加回归方程,R2,方差表,香不香?
- 靶场测试Writeup编写框架
- 搭建本地 HTTPS 环境
- JavaScript时钟
- 网址导航
- Ceph CSI 3.0.0 发布了!