【JZOJ 5132】 子序列
来源:互联网 发布:雷神笔记本怎么样知乎 编辑:程序博客网 时间:2024/06/11 16:36
Description
40%
dp,很简单所以不说了
100%
小写字母只有前9个,考虑抓住这个突破口
仔细观察dp式子
这可以写成矩阵的形式,我们可以预处理出矩阵前缀积,逆矩阵前缀积
Code
#pragma GCC optimize(2)#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define min(x,y) ((x)<(y)?(x):(y))#define max(x,y) ((x)>(y)?(x):(y))#define mset(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;typedef ll mat[10][10];const int N=1e5+5,mo=1e9+7;int n,s[N];ll A[10],B[10],C[10];mat f[N],inv[10],g[N],cmat[10];void read(int &t){ t=0;int p=1;char ch; for(ch=getchar();ch<'0' || ch>'9';ch=getchar())if(ch=='-') p=-1; for(;'0'<=ch && ch<='9';ch=getchar()) t=t*10+ch-'0';t*=p;}ll qmi(ll x,ll n){ ll t=1; for(;n;n>>=1,x=x*x%mo) if(n&1) t=t*x%mo; return t;}void mul(mat &c,mat a,mat b){ mset(c,0); fo(i,0,9) fo(j,0,9) fo(k,0,9) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%mo;}void getinv(mat &c,mat b){ mset(c,0);fo(i,0,9) c[i][i]=1; mat a;memcpy(a,b,sizeof(a)); fo(i,0,9) { int p=-1; fo(j,i,9) if(a[j][i]) {p=j;break;} swap(a[i],a[p]),swap(c[i],c[p]); ll ny=qmi(a[i][i],mo-2); fo(j,i+1,9) { ll t=mo-a[j][i]*ny%mo; fo(k,i,9) a[j][k]=(a[j][k]+t*a[i][k])%mo,c[j][k]=(c[j][k]+t*c[i][k])%mo; } } fd(i,9,0) { ll ny=qmi(a[i][i],mo-2); fo(j,0,i-1) { ll t=mo-a[j][i]*ny%mo; fo(k,i,9) a[j][k]=(a[j][k]+t*a[i][k])%mo,c[j][k]=(c[j][k]+t*c[i][k])%mo; } }}int main(){ freopen("sub9.in","r",stdin); freopen("sub.out","w",stdout); for(char ch=getchar();'a'<=ch && ch<='z';ch=getchar()) s[++n]=ch-'a'; fo(ch,0,8) fo(i,0,9) cmat[ch][i][i]=cmat[ch][i][ch]=1; fo(i,0,9) f[0][i][i]=inv[0][i][i]=g[0][i][i]=1; fo(i,1,n) mul(f[i],f[i-1],cmat[s[i]]); //fo(i,1,n) getinv(inv[i],f[i]); fo(i,0,8) getinv(inv[i],cmat[i]); fo(i,1,n) mul(g[i],inv[s[i]],g[i-1]); int l,r,Q; read(Q); while(Q--) { read(l),read(r); mset(A,0);A[9]=1; mset(B,0); fo(j,0,9) fo(k,0,9) B[j]=(B[j]+A[k]*g[l-1][k][j])%mo; mset(C,0); fo(j,0,9) fo(k,0,9) C[j]=(C[j]+B[k]*f[r][k][j])%mo; ll ans=0; fo(i,0,8) ans+=C[i]; printf("%lld\n",ans%mo); } return 0;}
阅读全文
0 0
- JZOJ 5132 子序列
- 【JZOJ 5132】 子序列
- 【JZOJ 4915】最长不下降子序列
- JZOJ 3742. 【TJOI2014】上升子序列
- 【挖坑记】JZOJ 4721 最长公共子序列
- JZOJ 4889 最长公共回文子序列(搜索)
- JZOJ 4920 降雷皇(最长上升子序列、线段树)
- JZOJ 4915. 【GDOI2017模拟12.9】最长不下降子序列
- 【JZOJ 4606】 序列
- 【JZOJ 4788】 序列
- JZOJ 4788. 序列
- 【JZOJ 4788】序列
- 【JZOJ 5231】 序列问题
- JZOJ 5231 序列问题
- JZOJ 5441 序列
- 【JZOJ 4910】子串
- jzoj 3467. 【NOIP2013模拟联考7】最长上升子序列(lis) dfs+lis+手工栈
- jzoj P1663【AHOI2009】维护序列
- 欢迎使用CSDN-markdown编辑器
- Header背景处理方案
- 2017.8.23-------树状数组---区间更新+区间查询
- MAC下pyenv和pyenv-virtualenv插件初探
- Qt中mouseMoveEvent在MainWindow中使用
- 【JZOJ 5132】 子序列
- Instability(typedef pair<LL,int> P;)
- 每日一个linux命令(6):su、su
- 选择控件只显示一行
- 《剑指offer》问题6 从尾到头打印链表 Java实现
- 1047. 编程团体赛(20)
- HDU1394 Minimum Inversion Number
- [UOJ#34]多项式乘法(FFT)
- 基本类型和引用类型作为参数传递