2019.01.19-2018年6月NEYC集训sequence
生活随笔
收集整理的這篇文章主要介紹了
2019.01.19-2018年6月NEYC集训sequence
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述:
茉優最近研究發現,一個人的想愿能力可以認為是字符串S的一個子串S[l,r],而連接值可以認為是這個子串的本質不同子序列個數。現在她想驗證她的結論是否正確,于是她給了你Q個詢問,希望你幫她來計算,注意空串也是子序列。
因為茉優已經有一個答案了,所以你只要輸出ZQ的值檢驗即可。
思路:
考慮對于取以字符i為結尾的轉移矩陣,是除了單位矩陣外,第一列為都為1,恰好表示除了以i為結尾的情況其他情況都*2.
于是構建出每個字母的轉移矩陣,是一個53*53的矩陣,叫它C[i]。
對于每一個詢問,答案其實是前Ar個矩陣的乘積,乘上前Al-1個矩陣的逆。
但是由于矩陣不滿足交換律,所以我們呢要做這樣的預處理。
Ar=Ar-1*Cs[a[r]]
B表示逆矩陣。
Bl=Cs[a[l]]*Bl-1
Ans=一個1*m的矩陣(只有第一位為0)*Bl*Ar
仔細分析可以發現關于B矩陣我們只需要知道第一行每一位數的數值,
A矩陣我們只需要知道每一列的和。
并且由于每個字母轉移矩陣的特殊性,計算過程中結果通常只和一行或一列相關,于是每次維護或一列即可,轉移時O(53)
總效率就是O(n*53).
以下代碼:
#include<bits/stdc++.h> #define il inline #define _(d) while(d(isdigit(ch=getchar()))) using namespace std; const int N=1e6+5,p=998244353; char s[N]; int Q,a0,b0,B,q,R,n,tag[55],ans; struct node{int l[55]; }a[N],b[N],c[55]; il int read(){int x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x; } il int C(char a){if(a<='Z')return a-'A'+1;return a-'a'+27; } il int mu(int x,int y){if(x+y>=p)return x+y-p;return x+y; } int main() {scanf(" %s",s+1);n=strlen(s+1);for(int i=0;i<53;i++)c[i].l[i]=a[0].l[i]=1;for(int i=1;i<=n;i++){int k=C(s[i]);for(int tmp,j=0;j<53;j++){tmp=c[j].l[k];c[j].l[k]=a[i-1].l[j];a[i].l[j]=mu(mu(a[i-1].l[j],a[i-1].l[j]),p-tmp);}}for(int i=0;i<53;i++){for(int j=0;j<53;j++){c[i].l[j]=0;}c[i].l[i]=1;}b[0].l[0]=1;for(int i=1;i<=n;i++){int k=C(s[i]);for(int tmp,j=0;j<53;j++){tmp=mu(c[k].l[j],p-tag[j]);c[k].l[j]=mu(c[k].l[j],tmp);tag[j]=mu(tag[j],tmp);b[i].l[j]=mu(c[0].l[j],p-tag[j]);}}Q=read();a0=read();b0=read();B=read();q=read();R=read();while(Q--){int a1,b1,l,r;a1=mu(mu(1ll*B*a0%p,1ll*q*b0%p),mu(ans,R));b1=mu(mu(1ll*B*b0%p,1ll*q*a0%p),mu(ans,R));a0=a1;b0=b1;l=a0%n+1;r=b0%n+1;if(l>r)swap(l,r);ans=0;for(int i=0;i<53;i++){ans=mu(ans,1ll*a[r].l[i]*b[l-1].l[i]%p);}}printf("%d\n",ans);return 0; } View Code?
轉載于:https://www.cnblogs.com/Jessie-/p/10291652.html
總結
以上是生活随笔為你收集整理的2019.01.19-2018年6月NEYC集训sequence的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Batch @Enable
- 下一篇: MapServer Tutorial——