LOJ#6074. 「2017 山东一轮集训 Day6」子序列

先考虑全局询问怎么做,设 f ( i , c ) f(i,c) f(i,c) 表示在 S 1 ⋯ i S_{1\cdots i} S1⋯i​ 中,最后一个选取 max ⁡ { j ∣ j ≤ i , S j = c } \max\{j|j\le i,S_j=c\} max{j∣j≤i,Sj​=c} 的子序列个数。本质上是在子序列自动机的 DAG 上计数路径,可以保证本质不同。

转移很简单:

f ( i , c ) = f ( i − 1 , c ) , ( c ≠ S i ) f ( i , c ) = ∑ j = 0 9 f ( i − 1 , j ) , ( c = S i ) \begin{gathered} f(i,c)=f(i-1,c),(c\ne S_i) \\ f(i,c)=\sum_{j=0}^9f(i-1,j),(c=S_i) \end{gathered} f(i,c)=f(i−1,c),(c​=Si​)f(i,c)=j=0∑9​f(i−1,j),(c=Si​)​
其中 f ( 0 , 0 ) = 1 f(0,0)=1 f(0,0)=1 特殊定义,字符集占位 1 ⋯ 9 1\cdots 9 1⋯9。

考虑怎么运用到区间查询上。初始状态为

P 0 = [ 1 0 ⋯ 0 ] T P_0=\begin{bmatrix} 1 & 0 & \cdots & 0 \end{bmatrix}^T P0​=[1​0​⋯​0​]T

转移为

F i = [ 1 1 ⋱ 1 1 1 1 1 1 ⋱ 1 ] F_i=\begin{bmatrix} 1 \\ &1\\ &&\ddots\\ 1 & 1 & 1& 1 & 1& 1\\ &&&&\ddots\\ &&&&&1 \end{bmatrix} Fi​=⎣⎢⎢⎢⎢⎢⎢⎡​11​11​⋱1​1​1⋱​11​⎦⎥⎥⎥⎥⎥⎥⎤​
其中第 S i S_i Si​ 行为 1。

则有 P n = F n ⋯ F 2 F 1 P 0 P_n=F_n\cdots F_2F_1P_0 Pn​=Fn​⋯F2​F1​P0​

试着对 F i F_i Fi​ 求个逆(可以用初等变换),发现

B i = F i − 1 = [ 1 1 ⋱ − 1 − 1 − 1 1 − 1 − 1 ⋱ 1 ] B_i=F_i^{-1}=\begin{bmatrix} 1 \\ &1\\ &&\ddots\\ -1 & -1 & -1& 1 & -1& -1\\ &&&&\ddots\\ &&&&&1 \end{bmatrix} Bi​=Fi−1​=⎣⎢⎢⎢⎢⎢⎢⎡​1−1​1−1​⋱−1​1​−1⋱​−11​⎦⎥⎥⎥⎥⎥⎥⎤​

对角线为 1,第 S i S_i Si​ 行除了第 S i S_i Si​ 列以外为 -1。

则我们求

P = F r F r − 1 ⋯ F l P 0 = F ^ r B ^ l − 1 P 0 P=F_rF_{r-1}\cdots F_lP_0=\hat F_r\hat B_{l-1}P_0 P=Fr​Fr−1​⋯Fl​P0​=F^r​B^l−1​P0​

或者写好一点,

a n s = [ 1 1 ⋯ 1 ] F ^ r B ^ l − 1 [ 1 0 ⋯ 0 ] T ans=\begin{bmatrix} 1 & 1 & \cdots & 1 \end{bmatrix}\hat F_r\hat B_{l-1}\begin{bmatrix} 1 & 0 & \cdots & 0 \end{bmatrix}^T ans=[1​1​⋯​1​]F^r​B^l−1​[1​0​⋯​0​]T
其中 F ^ n = F n F n − 1 ⋯ F 1 \hat F_n=F_nF_{n-1}\cdots F_1 F^n​=Fn​Fn−1​⋯F1​,即左乘前缀积; B ^ n = B 1 B 2 ⋯ B n \hat B_n=B_1B_2\cdots B_n B^n​=B1​B2​⋯Bn​,即右乘前缀积。

如果直接做,复杂度是 O ( ( n + q ) m 3 ) O((n+q)m^3) O((n+q)m3)。由于 F i , B i F_i,B_i Fi​,Bi​ 都相当稀疏,考虑直接递推得出。

左乘 F n F_n Fn​,相当于在原来基础上把第 S n S_n Sn​ 行的每个数变成了它们这一列的和。

考虑求 [ 1 1 ⋯ 1 ] F ^ n \begin{bmatrix}1 & 1 & \cdots & 1\end{bmatrix}\hat F_n [1​1​⋯​1​]F^n​,这相当于求它各列的和。于是我们维护每一列的和,即可 O ( m ) O(m) O(m) 单次转移。

右乘 B n B_n Bn​,相当于在原来基础上将每一行的每一个数(除了第 S i S_i Si​ 列的数)都减去当前行第 S i S_i Si​ 列的数。

考虑求 B ^ n [ 1 0 ⋯ 0 ] T \hat B_n\begin{bmatrix} 1 &0 & \cdots & 0\end{bmatrix}^T B^n​[1​0​⋯​0​]T,这相当于求它的第一列的每个数。维护第一列每个数的值和每行的全局增减标记即可。

时间复杂度 O ( ( n + m ) q ) O((n+m)q) O((n+m)q)。

#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long ll;
ll read() {ll x = 0, f = 1; char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + int(ch - '0');return x * f;
}
const int MAXN = 1e5 + 5, P = 1e9 + 7, M = 9;
namespace MINT {struct mint {int v;mint(int v = 0) : v(v) {}};int MOD(int v) {return v >= P ? v - P : v;}mint tran(int v) {return MOD(v % P + P);}mint operator + (mint a, mint b) {return MOD(a.v + b.v);}mint operator - (mint a, mint b) {return MOD(a.v - b.v + P);}mint operator * (mint a, mint b) {return 1ll * a.v * b.v % P;}mint qpow(mint a, int n=P-2) {mint ret = 1; for(; n; n >>= 1, a = a * a) if(n & 1) ret = ret * a; return ret;}
} using namespace MINT;
char s[MAXN];
int n, q;
mint f[MAXN][M+1], b[MAXN][M+1], tag[MAXN][M+1], matf[M+1][M+1], matb[M+1][M+1];
int main() {scanf("%s", s+1); n = strlen(s+1);q = read();for(int i = 0; i <= M; i++) f[0][i] = 1, matf[i][i] = 1, matb[i][i] = 1, tag[0][i] = 0;b[0][0] = 1;for(int i = 1; i <= n; i++) {int c = s[i] - 'a' + 1;for(int j = 0; j <= M; j++) {f[i][j] = f[i-1][j] - matf[c][j] + f[i-1][j];matf[c][j] = f[i-1][j];tag[i][j] = tag[i-1][j] - (matb[j][c] + tag[i-1][j]); matb[j][c] = matb[j][c] + (matb[j][c] + tag[i-1][j]);b[i][j] = matb[j][0] + tag[i][j];}}for(int i = 1; i <= q; i++) {int l = read(), r = read();mint ans = 0;for(int j = 0; j <= M; j++) ans = ans + f[r][j] * b[l-1][j];printf("%d\n", (ans-1).v);}return 0;
}

LOJ#6074. 「2017 山东一轮集训 Day6」子序列相关推荐

  1. 「2017 山东一轮集训 Day6」子序列(矩阵快速幂)

    /* 找出了一个dp式子 是否能够倍增优化 我推的矩阵不太一样 是 1 0 0 0 0 0 0 0 0 -1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 2求得逆矩阵大概就是1 0 0 0 ...

  2. Loj #6077. 「2017 山东一轮集训 Day7」逆序对

    Loj #6077. 「2017 山东一轮集训 Day7」逆序对 Solution 令fi,jf_{i,j}fi,j​表示前iii个数产生jjj个逆序对的方案数,每次考虑把i+1i+1i+1加入,有i ...

  3. LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告

    LOJ#6072. 「2017 山东一轮集训 Day5」苹果树 解题报告 好苹果会组成连通块,整棵树的权值为 ∑ i = 1 n c i [ c i ≥ 0 ] [ s i z n u m ( c i ...

  4. LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告

    LOJ#6103. 「2017 山东二轮集训 Day2」第一题 解题报告 前置知识:闭区间上的连续函数的零点存在性定理: 我们定义这样的函数: 定义域为 [ l , r ] ∩ Z [l,r]\cap ...

  5. [LOJ#6068]. 「2017 山东一轮集训 Day4」棋盘[费用流]

    题意 题目链接 分析 考虑每个棋子对对应的横向纵向的极大区间的影响:记之前这个区间中的点数为 \(x\) ,那么此次多配对的数量即 \(x\) . 考虑费用流,\(S\rightarrow 横向区间 ...

  6. loj#6100. 「2017 山东二轮集训 Day1」第一题 主席树+二分

    题目描述: 小火车沉迷垃圾手游不能自拔,正在玩碧蓝航线,可惜小火车的舰(lao)队(po)练度太低打不过副本,所以他只好去刷其余的副本来升级. 总共有 n 个副本编号从 1 到 n ,每个副本有个难度 ...

  7. loj #6070. 「2017 山东一轮集训 Day4」基因

    回文自动机好题啊! 解法一 每$\sqrt n \(分一块 每块建回文自动机到字符串末尾. 顺便开三个\)\sqrt n * n\(的数组记下预处理答案,回文自动机头指针,和每个节点第一次出现的右端点 ...

  8. #6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)

    #6073. 「2017 山东一轮集训 Day5」距离 给定一颗有nnn个节点带边权的树,以及一个排列ppp,path(u,v)path(u, v)path(u,v)为u,vu, vu,v路径上的点集 ...

  9. 容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对

    文章目录 Co-prime source solution code Character Encoding source solution code Tree and Constraints sour ...

最新文章

  1. C++的 STL堆 实现获取中位数
  2. 千里之堤毁于蚁穴------重点项目不能交付之谜(一)泥淖中的验收测试
  3. 双向slider滑动微信小程序组件slider组件
  4. 【HDOJ】2577 How to Type
  5. mysql数据库表中的类型_MySQL数据库中表类型MyISAM与InnoDB的区别
  6. 云图说丨“真人?机器?傻傻分不清!” WAF Bot管理,带你慧眼辨“精”!
  7. zabbix系列zabbix3.4监控mysql5.7
  8. FRR BGP协议分析14 -- 静态路由的处理流程
  9. Missing session attribute 'user' of type List 解决办法
  10. 电脑上怎么安装c语言编程软件,如何在自己的电脑上安装C语言运行的环境?
  11. 【清华大学】深入理解操作系统(陈渝) 第四章
  12. 如何使用手机软件将图片转换为文字
  13. 计算机二级的简单项目,2016年计算机二级考试VB简单综合应用题冲刺
  14. 如何利用阿里云进行创建属于自己的网站
  15. jmeter性能测试1-录制脚本
  16. 华为勇敢星实习生招聘面试经历和华为优招面试经历
  17. 微信开发者工具 页面颜色调整(多与黑白)
  18. Python包装网页微信API并实现简单自动回复
  19. STM32入门开发: 制作红外线遥控器(智能居家-万能遥控器)
  20. RMC(AC450)的各种通讯技术

热门文章

  1. Android位置框架之GPS精度顺藤摸瓜
  2. 虚拟同步技术(VSG)虚拟惯量J和阻尼系数D的自适应MATLAB/Simulink仿真
  3. Iterator使用
  4. How to Succeed in Graduate School
  5. Piecewise混沌映射/PWLCM混沌映射(含MATLAB代码)
  6. 中国的数字化转型案例简析 China’s digital transformation
  7. SQLAPI数据库访问接口访问MySQL数据库
  8. 2017滴滴出行校园招聘笔试题
  9. CSS写表格样式的两种基本方式
  10. 云原生监控平台 Prometheus 的相关概念及部署