题意:给出一个字符串,每次询问一个区间[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. Eureka 系列(07)服务注册与主动下线

    Eureka 系列(07)服务注册与主动下线 [TOC] Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(05)消息广播 中对 Eureka 消息广播的源码进行 ...

  2. Neo4j parameter

    Neo4j browser: $ :help param Set a parameter Set a parameter to be sent with queries. The :param nam ...

  3. Mint安装配置Sublime Text3

    1.注册码: Sublime Text 3 3126 注册码 2.安装Package Control组件: 按Ctrl+`调出console(注:安装有QQ输入法的这个快捷键会有冲突的,输入法属性设置 ...

  4. react 16.3+ 新生命周期 作业

    1.有哪些⽣命周期被舍弃(3个),哪些⽣命 周期是新增(2个)? componentWillMount().componentWillReceiveProps().componentWillUpdat ...

  5. texindex - 对 Texinfo 索引文件排序

    SYNOPSIS 总览 texindex [OPTION]... FILE... DESCRIPTION 描述 为每个 Tex 输出文件 FILE 产生一个已排序的索引.通常对于文档 `foo.tex ...

  6. C# 关于获取周,月,年时间大全

    DateTime now = DateTime.Now; DayOfWeek dayOfWeek = now.DayOfWeek; : (int)dayOfWeek; //本周第一天(此结果是周一,如 ...

  7. 【JS学习】慕课网2-7 练习题:制作新按钮,“新窗口打开网站” ,点击打开新窗口。

    要求: 1.新窗口打开时弹出确认框,是否打开 提示: 使用 if 判断确认框是否点击了确定,如点击弹出输入对话框,否则没有任何操作. 2.通过输入对话框,确定打开的网址,默认为 http://www. ...

  8. 微信小程序 封装接口

    1.util-util.js //封装接口 let baseURL = 'http://127.0.0.1:3000/'; //接口路径 let request = function (url, op ...

  9. PHP多参数方法的重构

    假设我们要完成一个保存文章的功能,如果采用函数编程的方式,大概会是下面这个样子: <?php function saveArticle($title, $content, $categoryId ...

  10. JavaScript事件绑定的常见方式

    在Javascript中,事件绑定一共有3种方式: ① 行内绑定 ② 动态绑定 ③ 事件监听 原文: https://mbd.baidu.com/newspage/data/landingsuper? ...