题意:给出一个字符串,每次询问一个区间[l,r],求使得这个区间含有9102但不含有8102最少要删掉几个字符

首先我们考虑将串反转,这样就变成了含有2019但不含有2018的问题了

我们构建一个状态数为5的自动机

状态0:字符集为空

状态1:字符集为2

状态2:字符集为20

状态3:字符集为201

状态4:字符集为2019

每加入一个字符就为对应的两个状态连一条边

两个字串合并我们只需对两个字符串的自动机进行一次dp即可

这样我们维护一个自动机的线段树,每个区间维护一个子串的自动机

查询的时候合并字串区间的自动机即可

AC代码:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=2e5+;
struct Matrix {
int a[][]; void init() {
memset(a, INF, sizeof(a));
for (int i = ; i < ; i++)a[i][i] = ;
}
void print()
{
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++)cout << a[i][j] << " ";
cout << endl;
}
}
Matrix operator*(Matrix A) {
Matrix ret;
memset(ret.a,INF, sizeof(ret.a));
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
for (int k = ; k < ; k++)
//因为是倒过来的2019,合并自动机我们要反过来合并
ret.a[i][j] = min(ret.a[i][j], A.a[i][k] + a[k][j]);
return ret;
}
}tree[maxn<<]; char s[maxn];
void pushup(int rt) {
tree[rt] = tree[rt << ] * tree[rt << | ];
}
void build(int l,int r,int rt) {
if (l == r) {
tree[rt].init();
if (s[l] == '')tree[rt].a[][] = , tree[rt].a[][] = ;
else if (s[l] == '')tree[rt].a[][] = , tree[rt].a[][] = ;
else if (s[l] == '')tree[rt].a[][] = , tree[rt].a[][] = ;
else if (s[l] == '')tree[rt].a[][] = , tree[rt].a[][] = ;
else if (s[l] == '')tree[rt].a[][] = , tree[rt].a[][] = ;
return;
}
int m = (l + r) >> ;
build(l, m, rt << );
build(m + , r, rt << | );
pushup(rt);
} Matrix query(int L,int R,int l,int r,int rt) {
if (L <= l && r <= R)return tree[rt];
int m = (l + r) >> ;
Matrix res;
res.init();
if (L <= m)res = query(L, R, l, m, rt << );
if (R > m)res = res * query(L, R, m + , r, rt << | );
return res;
} int main() {
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int n, q, l, r;
cin >> n >> q;
cin >> (s + );
build(, n, );
while (q--) {
cin >> l >> r;
Matrix res = query(l, r, , n, );
cout << (res.a[][] == INF ? - : res.a[][]) << '\n';
}
return ;
}

2019ICPC南昌网络赛C Hello 2019的更多相关文章

  1. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  2. 2019icpc南昌网络赛_I_Yukino With Subinterval

    题意 给定一个序列,两种操作,单点修改,询问区间\([l,r]\)值域在\([x,y]\)范围内的连续段个数. 分析 原数组为\(a\),构造一个新的数组\(b\),\(b[i]=(a[i]==a[i ...

  3. 2019ICPC南昌网络赛总结

    打的很崩的一场比赛.上来签到题我就wa了一发,感觉在梦游.然后我开了H题,队友开B题,f(n)=3f(n-1)+2f(n)傻子都知道矩阵快速幂,但是1e7的强制在线必须把logn优化,然后试图打表寻找 ...

  4. 2019icpc南昌网络赛

    B. Fire-Fighting Hero (dijstra优先队列+bfs) 题意:刚开始看错题了,以为是k次dijkstra,但是wa了,后来队友指正后发现挺水的.求S到其它点的最短路的最大值an ...

  5. 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)

    题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...

  6. ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval

    ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...

  7. 2019 ICPC 南昌网络赛

    2019 ICPC 南昌网络赛 比赛时间:2019.9.8 比赛链接:The 2019 Asia Nanchang First Round Online Programming Contest 总结 ...

  8. ACM-ICPC 2019南昌网络赛F题 Megumi With String

    ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...

  9. 分治维护dp——19南昌网络赛C/cf750E

    南昌网络赛,是cf的原题 第一次做到这种题,所以认真想了下,每次给一个询问[L,R],要求出这个区间里有2017子序列,但是不能有2016子序列需要删掉的最少元素个数 首先如果我们之询问一小段区间[L ...

随机推荐

  1. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍

    一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...

  2. 【webpack】webpack之postcss-loader的基本使用---【巷子】

    一.postcss-loader简介 postcss-loader 用来对.css 文件进行处理,并添加在 style-loader 和 css-loader 之后.通过一个额外的 postcss 方 ...

  3. winserver 2008 找不到回收站的解决办法

    桌面新建文件夹,命名为 “回收站.{645ff040-5081-101b-9f08-00aa002f954e}”,就可以了.

  4. docker内的应用访问宿主机上的mysql和Redis

    背景:宿主机部署MySQL.Redis,docker内部署tomcat.jdk 需求:tomcat内的应用访问宿主机的MySQL和Redis 方法:     一.连接地址切记不能用localhost和 ...

  5. 慎用margin系列1---CSS的margin塌陷(collapse) 问题与对策

      对于以下简单代码: 如果您认为应该是这样的话: 那就错了.结果是这样的: 因为CSS中存在一个margin collapse,即边界塌陷或者说边界重叠.对于上下两个并列的div块而言,上面div的 ...

  6. Tomcat启动脚本(1)startup.bat

    @echo off rem Licensed to the Apache Software Foundation (ASF) under one or more rem contributor lic ...

  7. 聊聊redis实际运用及骚操作

    前言 聊起 redis 咱们大部分后端猿应该都不陌生,或多或少都用过.甚至大部分前端猿都知道. 数据结构: string. hash. list. set (无序集合). setsorted(有序集合 ...

  8. Python-数字类型补充

    Python第五节数字类型补充 数字类型转换 int(x) float(x) complex(x) complex(x, y) 数学常量 pi e PS 数字类型不允许改变 也就是说,当我们对数字类型 ...

  9. adb 提示adb server version(31) doesn't match this client(40) 解决办法

    有时候我们用adb工具去连接安卓设备,或者模拟器的时候,会提示adb server version(31) doesn't match this client(40)这样的提示.如图 提示的字面意思就 ...

  10. linux下如何挂载磁盘

    1.显示磁盘使用情况:#df 2.显示磁盘:#fdisk -l 3.格式化分区:#mkfs.ext4 /dev/vdb1           //注:将/dev/vdb1格式化为ext4类型(文件类型 ...