#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;
}
[ DP 莫隊 ]「2017 山東一輪集訓 Day6」LOJ#6074 子序列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.