[ DP 莫隊 ]「2017 山東一輪集訓 Day6」LOJ#6074 子序列

題解

#include<bits/stdc++.h>
using namespace std;
const int SZ=1<<25; 
char nc() {
    static char buf[SZ],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,SZ,stdin),p1==p2)?EOF:*p1++;
}
void Read(int& x) {
    char c=nc();
    for(;c<'0'||c>'9';c=nc());
    for(x=0;c>='0'&&c<='9';x=(x<<3)+(x<<1)+c-48,c=nc());
}
int Read(int* a) {
    char c=nc();int len=0;
    for(;c<'a'||c>'z';c=nc());
    for(;c>='a'&&c<='z';c=nc()) a[++len]=c-'a'+1;
    return len;
}
typedef long long ll;
const int N=100010;
const int P=1000000007;
struct Node {
    int l,r,id;
}c[N];
int k,n,m;
int a[N];
int S,b[N];
ll Res,cnt[10][10];
int Ans[N];
char s[N];
bool Cmp(Node x,Node y) {
    return b[x.l]<b[y.l]||(b[x.l]==b[y.l]&&(b[x.l]&1?x.r<y.r:x.r>y.r));
}
void Add(ll& x,int y) {
    x=(x+y)%P;
}
void Add_r(int x) {
    for(int i=1;i<=9;i++) {
        int y=cnt[i][0]-cnt[i][x]+(i==x);
        Res+=y;Add(cnt[i][x],y);Add(cnt[i][0],y);Add(cnt[0][x],y);
    }
    Res%=P;
}
void Add_l(int x) {
    for(int i=1;i<=9;i++) {
        int y=cnt[0][i]-cnt[x][i]+(i==x);
        Res+=y;Add(cnt[x][i],y);Add(cnt[0][i],y);Add(cnt[x][0],y);
    }
    Res%=P;
}
void Del_r(int x) {
    for(int i=1;i<=9;i++) {
        int y=-cnt[i][0]+cnt[i][x]-(i==x);
        Res+=y;Add(cnt[i][x],y);Add(cnt[i][0],y);Add(cnt[0][x],y);
    }
    Res%=P;
}
void Del_l(int x) {
    for(int i=1;i<=9;i++) {
        int y=-cnt[0][i]+cnt[x][i]-(i==x);
        Res+=y;Add(cnt[x][i],y);Add(cnt[0][i],y);Add(cnt[x][0],y);
    }
    Res%=P;
}
int main() {
    n=Read(a);S=sqrt(n);
    for(int i=1;i<=n;i++) b[i]=(i-1)/S+1;
    Read(m);
    for(int i=1;i<=m;i++) Read(c[i].l),Read(c[i].r),c[i].id=i;
    sort(c+1,c+m+1,Cmp);
    int L=1,R=0;
    for(int i=1;i<=m;i++) {
        while(R<c[i].r) Add_r(a[++R]);
        while(R>c[i].r) Del_r(a[R--]);
        while(L>c[i].l) Add_l(a[--L]);
        while(L<c[i].l) Del_l(a[L++]);
        Ans[c[i].id]=Res;
    }
    for(int i=1;i<=m;i++) printf("%d\n",(Ans[i]+P)%P);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章