【JZOJ6216】【20190614】序列计数
题目
一个长为\(N\)的串\(S\),\(M\)询问区间\([l,r]\)不同的子串个数,字符集为$ C $
\(N ,M \le 10^5 \ , \ C \le 10\)
题解
这题非常套路。。。
part 1
设\(dp_{i,j}\)为考虑i,字符j结尾的子串个数,考虑\(S_i=c\)
\[\begin{align}
&dp_{i,j} = dp_{i,j}\\
&dp_{i,c} = \sum_{j} dp_{i-1,j} + 1
\end{align}
\]part 2
设一个大小\(C+1\)的矩阵,写出转移矩阵
\[A_i = \begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
1 & 1 & 1 & 1\\
0 & 0 & 0 & 1\\
\end{pmatrix}
\]它的逆矩阵
\[B_i = \begin{pmatrix}
1 & 0 & 0 & 0\\
0 & 1 & 0 & 0\\
-1 & -1 & -1 & -1\\
0 & 0 & 0 & 1\\
\end{pmatrix}
\]只需要预处理出矩阵的前缀即可
part 3
左乘一个A相当于某一行变为所有行的和,可以维护一列的和
右乘一个B相当于其它列减去某一列,可以维护整体减法标记
统计答案也可以直接利用维护的东西,具体见代码
时间复杂度$ O((N+M)C) $
#include<bits/stdc++.h>
using namespace std;
const int N=500010,mod=1e9+7;
int n,m,f1[N][11],f2[N][11];
char s[N],ps[1000000],*pp=ps;
void flush(){fwrite(ps,1,pp-ps,stdout);pp=ps;}
void push(char x){if(pp==ps+1000000)flush();*pp++=x;}
void write(int x){
static int sta[20],top;
if(!x){push('0');push('\n');return;}
while(x)sta[++top]=x%10,x/=10;
while(top)push(sta[top--]^'0');
push('\n');
}
void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
void dec(int&x,int y){x-=y;if(x<0)x+=mod;}
struct Mat{
int c[11][11],s[11],d[11],D;
void init(){for(int i=0;i<11;++i)c[i][i]=s[i]=1;}
void plus(int I){
for(int i=0;i<11;++i){
int t=c[I][i];c[I][i]=s[i];
s[i]=(2*s[i]%mod-t+mod)%mod;
}
}
void minus(int I){
for(int i=0;i<11;++i){
int t=d[i];d[i]=c[i][I];
c[i][I]=(2*d[i]%mod-t+mod)%mod;
}
}
void print(int typ){
for(int i=0;i<11;++i,puts(""))
for(int j=0;j<11;++j){
int t=typ?(c[i][j]-d[i]+mod)%mod:c[i][j];
if(mod-t<t)t=t-mod;
printf("% 2d ",t);
}
puts("\n");
if(!typ)for(int i=0;i<11;++i)printf("%d ",s[i]);
puts("\n");
}
}A,B;
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
scanf("%s%d",s+1,&m);n=strlen(s+1);
A.init(),B.init();f2[0][10]=1;
for(int i=1;i<=n;++i){
A.plus(s[i]-'a');
B.minus(s[i]-'a');
for(int j=0;j<11;++j){
f1[i][j]=A.s[j];
f2[i][j]=(B.c[j][10]-B.d[j]+mod)%mod;
}
}
for(int i=1,l,r,ans;i<=m;++i){
scanf("%d%d",&l,&r);
ans=0;for(int j=0;j<11;++j)inc(ans,1ll*f1[r][j]*f2[l-1][j]%mod);
if(!ans)ans=mod-1;else ans--;write(ans);
}
return flush(),0;
}
【JZOJ6216】【20190614】序列计数的更多相关文章
- [Sdoi2017]序列计数 [矩阵快速幂]
[Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...
- HDU 6348 序列计数 (树状数组 + DP)
序列计数 Time Limit: 4500/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- luogu3702-[SDOI2017]序列计数
Description Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数. Alice还希望,这nn个数中,至少有一个数是质数. Alice想知 ...
- BZOJ4818 序列计数
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- P3702 [SDOI2017]序列计数
P3702 [SDOI2017]序列计数 链接 分析: 首先可以容斥掉,用总的减去一个质数也没有的. 然后可以dp了,f[i][j]表示到第i个数,和在模p下是j的方案数,矩阵快速幂即可. 另一种方法 ...
- 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法
[BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...
- BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*
BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...
- 【BZOJ4818】序列计数(动态规划,生成函数)
[BZOJ4818]序列计数(生成函数) 题面 BZOJ 题解 显然是求一个多项式的若干次方,并且是循环卷积 或者说他是一个\(dp\)也没有问题 发现项数很少,直接暴力乘就行了(\(FFT\)可能还 ...
随机推荐
- C# Datatable、DataReader等转化json
//对象转换为Json字符串 public static string ToJson(object jsonObject) { object objectValue = string.Empty; s ...
- 勒索病毒,华为/H3C三层交换机/路由器用ACL访问控制实现端口禁用
前不久勒索病毒横行,很多人都纷纷中招,从公司到个人,损失相当惨重.有些公司在互联网入口上做了控制,但是这样并非完全,万一有人把中了毒的U盘插入网内设备上呢?那我们的内网中很有可能集体中招(打过相关补丁 ...
- 在windows服务中使用定时器
在windows服务中,利用winform中直接拖动timer控件的方式使用定时器是不可以的,启动服务后会发现定时器并没有执行.那么在windows服务中如何使用定时器呢? 不使用直接拖动控件的方式 ...
- Java调用Http/Https接口(2)--HttpURLConnection/HttpsURLConnection调用Http/Https接口
HttpURLConnection是JDK自身提供的网络类,不需要引入额外的jar包.文中所使用到的软件版本:Java 1.8.0_191. 1.服务端 参见Java调用Http接口(1)--编写服务 ...
- 易百教程人工智能python修正-人工智能无监督学习(聚类)
无监督机器学习算法没有任何监督者提供任何指导. 这就是为什么它们与真正的人工智能紧密结合的原因. 在无人监督的学习中,没有正确的答案,也没有监督者指导. 算法需要发现用于学习的有趣数据模式. 什么是聚 ...
- vue中常见的指令
1,差值表达式{{}} <p >{{ msg }}</p> 2.v-cloak解决差值表达式闪烁的问题 <p v-cloak>{{ msg }}</p> ...
- vue中keep-alive,include的指定页面缓存问题
做vue项目时,有时要在某些页面做缓存,而其它页面不要.比如:A:首页,B:获取所有订单页面,C:订单详情页面:从A(首页)进入 B(获取所有订单)时应该不缓存,B(所有订单)进入 C(订单详情)订单 ...
- Mac音频播放
Mac音频播放 audioqueue播放pcm数据 http://msching.github.io/blog/2014/08/02/audio-in-ios-5/ audiounit播放pcm数据 ...
- springboot通过idea打jar包
springboot打jar包 一. 检查pom文件 <packaging>jar</packaging> 二. 切换到maven窗口 三. 先c ...
- Windows系统Apache下载和安装
一.Apache的下载 1.访问Apache官网:https://httpd.apache.org 2.选择Windows版本下载 3.下载完成后解压缩,把文件放到自己想放的盘 二.Apache的安装 ...