HDU 6155 Subsequence Count
来源:互联网 发布:火狐浏览器打不开淘宝 编辑:程序博客网 时间:2024/06/07 07:40
题目链接:Subsequence Count
题意:给出一个
题解:先考虑如何算出一个01字符串有多少个不相同的子串,很容易得到一个
#include <bits/stdc++.h>using namespace std;const int N = 100005;const long long MOD = 1000000007;struct Mat{ long long m[3][3]; Mat(){} Mat(int op){ if(op>0){ m[0][0]=m[0][1]=m[0][2]=1; m[1][0]=0;m[1][1]=1;m[1][2]=0; m[2][0]=m[2][1]=0;m[2][2]=1; }else if(op==0){ m[0][0]=1;m[0][1]=m[0][2]=0; m[1][0]=m[1][1]=m[1][2]=1; m[2][0]=m[2][1]=0;m[2][2]=1; }else if(op==-1){ m[0][0]=m[0][1]=m[0][2]=0; m[1][0]=m[1][1]=m[1][2]=0; m[2][0]=m[2][1]=m[2][2]=0; }else{ m[0][0]=1;m[0][1]=m[0][2]=0; m[1][0]=0;m[1][1]=1;m[1][2]=0; m[2][0]=m[2][1]=0;m[2][2]=1; } } Mat operator *(const Mat& rhs){ Mat c(-1); for(int i=0;i<3;i++) for(int j=0;j<3;j++) for(int k=0;k<3;k++) c.m[i][k]+=m[i][j]*rhs.m[j][k]; for(int i=0;i<3;i++) for(int j=0;j<3;j++) c.m[i][j]%=MOD; return c; } void operator =(const Mat& rhs){ for(int i=0;i<3;i++) for(int j=0;j<3;j++) m[i][j]=rhs.m[i][j]; } void Rev(){ for(int i=0;i<3;i++) swap(m[0][i],m[1][i]); for(int i=0;i<3;i++) swap(m[i][0],m[i][1]); } void Print(){ for(int i=0;i<3;i++){ for(int j=0;j<3;j++) cout<<m[i][j]<<' ';cout<<endl; } }};struct Node{ int l,r,tg; Mat v;}a[N<<2];char s[N];inline void PushUp(int i){ a[i].v=a[i<<1].v*a[i<<1|1].v;}void Build(int i,int l,int r){ a[i].l=l; a[i].r=r; a[i].tg=0; if(l==r){ a[i].v=Mat(s[l]-'0'); return ; } int mid=l+r>>1; Build(i<<1,l,mid); Build(i<<1|1,mid+1,r); PushUp(i);}inline void PushDown(int i){ if(a[i].tg){ a[i<<1].v.Rev(); a[i<<1].tg^=1; a[i<<1|1].v.Rev(); a[i<<1|1].tg^=1; a[i].tg=0; }}void Mul(int i,int l,int r){ if(l<=a[i].l&&a[i].r<=r){ a[i].v.Rev(); a[i].tg^=1; return ; } PushDown(i); if(l<=a[i<<1].r) Mul(i<<1,l,r); if(a[i<<1|1].l<=r) Mul(i<<1|1,l,r); PushUp(i);}Mat Qry(int i,int l,int r){ if(l<=a[i].l&&a[i].r<=r) return a[i].v; PushDown(i); if(r<=a[i<<1].r) return Qry(i<<1,l,r); else if(a[i<<1|1].l<=l) return Qry(i<<1|1,l,r); else return Qry(i<<1,l,r)*Qry(i<<1|1,l,r);}int main(){ int T,n,q,op,x,y; Mat c; scanf("%d",&T); while(T--){ scanf("%d %d %s",&n,&q,s+1); Build(1,1,n); while(q--){ scanf("%d %d %d",&op,&x,&y); if(op==1) Mul(1,x,y); else{ c=Qry(1,x,y); printf("%lld\n",(c.m[0][2]+c.m[1][2])%MOD); } } } return 0;}
阅读全文
0 0
- [HDU 6155] Subsequence Count
- HDU 6155 Subsequence Count
- HDU 6155 Subsequence Count(线段树 dp)
- HDU 6155 Subsequence Count [线段树维护矩阵]
- HDU 6155 Subsequence Count dp + 矩阵+ 线段树
- Hdu 6155 Subsequence Count 矩阵计算DP+线段树维护
- Subsequence Count
- Subsequence HDU
- hdu 1159 Common Subsequence
- HDU 1159 Common Subsequence
- HDU 3530 Subsequence
- HDU 1159 Common Subsequence
- HDU 1158 Common Subsequence
- hdu 1159 Common Subsequence
- HDU 1159 Common Subsequence
- HDU 1159 Common Subsequence
- hdu 1159 Common Subsequence
- hdu 1008 Common Subsequence
- javabean简介
- SQLServer2008/2012 删除所有表视图存储过程
- JSP学习——九大内置对象
- 【LEDE】树莓派上玩LEDE终极指南-1-LEDE的编译和安装
- Android无缝切换主题,动态换肤
- HDU 6155 Subsequence Count
- java web excel导入数据库
- 大型网站架构之分布式消息队列
- 正向代理与反向代理
- Callable,Runnable比较及用法
- C++ 闭包(closure)
- 常用的一些GIT指令
- SVN is already locked.
- allegro学习之绘制板框的时候定位孔如何放置以及对板边的距离为多少合适