jzoj6008. 【THUWC2019模拟2019.1.18】Sequence (矩阵加速)
题面
茉优最近研究发现,一个人的想愿能力可以认为是字符串S的一个子串S[l,r],而连接值可以认为是这个子串的本质不同子序列个数。现在她想验证她的结论是否正确,于是她给了你Q个询问,希望你帮她来计算,注意空串也是子序列。

题解
考场上暴力都打错
先考虑暴力,设\(f_i\)为\(i\)下标为终止位置的子序列个数,那么\(f_i\)就等于前面的所有\(f_j,j<i\)的和,不过要减去所有\(s_j=s_i\)的\(f_j\),否则会重复
然后考虑把\(f_i\)给前缀和,先离散化,设一个向量,其中\(A_i\)表示以\(i\)这个值为结尾的子序列个数,最后一个值表示空集,那么转移矩阵就是其它都和单位矩阵一样,第\(s_i\)列全为\(1\)
然后考虑转移矩阵的逆矩阵,就是其它和单位矩阵一样,第\(s_i\)列除主对角线上全为\(-1\),主对角线上为\(1\)
那么,只要我们能够维护\(B_1B_2...B_i\),,记为\(h_i\),以及\(B^{-1}_iB^{-1}_{i-1}...B^{-1}_1\),记为\(c_i\)对于询问,我们就可以快速表示了,为\([0,0,0,...,1]\times h_{l-1}\times c_r\)
如何维护前缀积?以\(h_i\)为例,发现一个矩阵左乘上\(B_i\),就是其它列都不变,第\(s_i\)列的每一个数都变为这一行所有元素的和,动态维护每行的元素和并单列修改即可。而一个矩阵右乘上\(B^{-1}_i\),第\(s_i\)行不变,其它列每个元素\(A_{i,j}\)都减去\(A_{s_i,j}\),可以打个\(tag\)
然而这样是\(O(53^2|S|)\)
考虑\([0,0,0,...,1]\times h_{l-1}\),最终结果就是\(h_{i-1}\)的最下面一行,你们我们对于每个位置的\(h\)只要记录最下面一行就好了。后面要乘上\(c_r\),因为我们最终需要的是整个向量所有数的和,发现每一项都乘了对应行的和,所以每个位置只要记录对应行的和就行了
复杂度\(O(53|S|)\)
///minamoto
#include<bits/stdc++.h>
#define R register
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
inline int max(const R int &x,const R int &y){return x>y?x:y;}
inline int min(const R int &x,const R int &y){return x<y?x:y;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res=1,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1e6+5,M=52,P=998244353;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int h[N][M+5],c[N][M+5],A[M+5][M+5],tag[M],sum[M];
char s[N];
int a,b,p,q,r,x,y,z,Q,n,la,lb;
inline int calc(R char ch){return ch>='a'?ch-'a'+26:ch-'A';}
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
scanf("%s",s+1),n=strlen(s+1);
scanf("%d%d%d%d%d%d",&Q,&a,&b,&p,&q,&r);
fp(i,0,M)A[i][i]=sum[i]=1;
fp(i,1,n){
int v=calc(s[i]);
fp(j,0,M){
sum[j]=dec(sum[j],A[j][v]),A[j][v]=add(A[j][v],sum[j]);
sum[j]=add(sum[j],A[j][v]);
h[i][j]=sum[j];
}
}
memset(A,0,sizeof(A));
fp(i,0,M)A[i][i]=1;
fp(i,1,n){
int v=calc(s[i]);
fp(j,0,M){
A[v][j]=dec(A[v][j],tag[j]);
tag[j]=add(tag[j],A[v][j]);
A[v][j]=add(A[v][j],tag[j]);
c[i][j]=dec(A[M][j],tag[j]);
}
}
while(Q--){
la=a,lb=b;
a=(1ll*la*p+1ll*lb*q+z+r)%P;
b=(1ll*lb*p+1ll*la*q+z+r)%P;
x=min(a%n,b%n)+1,y=max(a%n,b%n)+1;
if(x==1)z=h[y][M];
else{
z=0;
fp(i,0,M)z=add(z,mul(c[x-1][i],h[y][i]));
}
// printf("QAQ %d %d %d\n",x,y,z);
}
printf("%d\n",z);
return 0;
}
jzoj6008. 【THUWC2019模拟2019.1.18】Sequence (矩阵加速)的更多相关文章
- jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)
Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...
- 6362. 【NOIP2019模拟2019.9.18】数星星
题目描述 题解 一种好想/好写/跑得比**记者还快的做法: 对所有询问排序,按照R递增的顺序来处理 维护每个点最后一次被覆盖的时间,显然当前右端点为R时的答案为所有时间≥L的点的权值之和 LCT随便覆 ...
- jzoj6003. 【THUWC2019模拟2019.1.16】Square (乱搞)
题面 题解 不难发现,如果一行最后被染色,那么这行的颜色肯定一样,如果倒数第二个被染色,那么除了被最后一个染色的覆盖的那一部分剩下的颜色肯定一样 于是题目可以转化为每一次删去一行或一列颜色相同的,问最 ...
- 6361. 【NOIP2019模拟2019.9.18】鲳数
题目 题目大意 给你一个区间\([l,r]\),求这个区间内每个整数的十进制上从高位到低位的逆序对个数之和. 思考历程 一开始就知道这是个数位DP-- 结果一直都没有调出来,心态崩了-- 正解 先讲讲 ...
- 2019.3.18考试&2019.3.19考试&2019.3.21考试
2019.3.18 C O D E T1 树上直接贪心,环上for一遍贪心 哇说的简单,码了将近一下午终于码出来了 感觉自己码力/写题策略太糟糕了,先是搞了一个细节太多的写法最后不得不弃疗了,然后第二 ...
- 【 CodeForces - 392C】 Yet Another Number Sequence (二项式展开+矩阵加速)
Yet Another Number Sequence Description Everyone knows what the Fibonacci sequence is. This sequence ...
- hdu_5950_Recursive sequence(矩阵快速幂)
题目链接:hdu_5950_Recursive sequence 题意:递推求解:F(n) = 2*F(n-2) + F(n-1) + n4 和F(1) = a,F(2) = b: 题解: 一看数据范 ...
- NOIP模拟 17.8.18
NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也 ...
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
随机推荐
- (*)(转)要快速学习SSM框架,你需要一套学习曲线平滑的教程
作者:meepo链接:https://www.zhihu.com/question/57719761/answer/156952139来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...
- bind(),live(),delegate(),on()绑定事件方式
1.bind():向匹配元素添加一个或多个事件处理器. 适用所有版本,但是自从jquery1.7版本以后bind()函数推荐用on()来代替. $(selector).bind(event,data, ...
- XXL-Job集群
底层已经实现好了 调度中心集群 调度中心支持集群部署,提升调度系统容灾和可用性. 调度中心集群部署时,几点要求和建议: DB配置保持一致: 登陆账号配置保持一致: 群机器时钟保持一致(单机集群忽视): ...
- chrome浏览器常用快捷键
chrome浏览器常用快捷键 一.总结 一句话总结: Ctrl + j:打开“下载内容”页 Ctrl + t:打开新的标签页,并跳转到该标签页 Ctrl + d:将当前网页保存为书签 1.在新标签页中 ...
- 微信小程序module.exports 模块化
//common.js var studentList = [ { name: "xiaoming", age: "22" ...
- Visual Studio 2012 与此版本的 Windows 不兼容 解决
警告: [Window Title] 程序兼容性助手[Main Instruction] 此程序存在已知的兼容性问题[Expanded Information] Visual Studio 2012 ...
- ivew组件的使用
iview的官网:https://www.iviewui.com/docs/guide/start 1.选择快速上手 2.安装 解压,cmd,cd进你解压后的文件,cnpm i 3.打包 npm ru ...
- codevs 2144 砝码称重2
传送门 2144 砝码称重 2 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 有n个砝码,现在要称一个质量为m ...
- 1130 host is not allowed to connect to
mysql 远程访问不行解决方法 Host is not allowed to connect to this MySQL server 如果你想连接你的mysql的时候发生这个错误: ERROR 1 ...
- dubbo的防痴呆设计
项目中也经常会遇到各种因为配置而引入的问题,很多技术支持解决不掉就找开发,结果发现大部分还是配置错误或网络不通等.如果在设计之初就能考虑到并针对这些问题做出应对设计,甚至给出异常的解决方案,确实可以减 ...