题目大意
我才懒得写呢......
题解
妙到让我跑来单独写(水)一篇题解。
首先我们可以有一些令人窒息的操作:
然后我们可以有一些更加令人窒息的操作:
上述内容摘自租酥雨的课件,所以貌似我什么都没写,因为我才懒得写呢。
主要是复杂度\(O(n|S|)\)比较仙。
代码
MDZZ我竟然会放代码?
#include<bits/stdc++.h>
#define IL inline
#define _ 200005
#define ll long long
using namespace std ;
IL int gi(){
int data = 0 , m = 1; char ch = 0;
while(ch!='-' && (ch<'0'||ch>'9')) ch = getchar();
if(ch == '-'){m = 0 ; ch = getchar() ; }
while(ch >= '0' && ch <= '9'){data = (data<<1) + (data<<3) + (ch^48) ; ch = getchar(); }
return (m) ? data : -data ;
}
#define P 30
ll M[P][P],q[P],A[P][_],B[P][_],sum[P],n,f1[P],f2[P],tag[P],Q,C,Ans ; char s[_] ;
#define mod 1000000007
IL void Mem() {
for(int i = 0; i <= C; i ++)
for(int j = 0; j <= C; j ++) M[i][j] = 0 ;
for(int i = 0; i <= C; i ++) M[i][i] = 1 ; return ;
}
int main() {
scanf("%s" , s + 1) ; C = 26 ;
n = strlen(s + 1) ;
Mem() ; for(int i = 0; i <= C; i ++) A[i][0] = sum[i] = 1 ; A[C][0] = 0 ;
for(int sq = 1,c; sq <= n; sq ++) {
c = s[sq] - 'a' ;
for(int i = 0; i <= C; i ++) q[i] = M[i][c] , M[i][c] = sum[i] ;
for(int i = 0; i <= C; i ++) sum[i] = (2ll * sum[i] % mod - q[i] + mod) % mod ;
for(int i = 0; i <= C; i ++) A[i][sq] = (sum[i] - M[i][C] + mod) % mod ;
}
Mem() ; for(int i = 0; i <= C; i ++) B[i][0] = tag[i] = 0 ; B[C][0] = 1 ;
for(int sq = 1,c; sq <= n; sq ++) {
c = s[sq] - 'a' ;
for(int i = 0; i <= C; i ++) q[i] = (M[c][i] + tag[i]) % mod ;
for(int i = 0; i <= C; i ++) M[c][i] = (M[c][i] + q[i]) % mod , tag[i] = (tag[i] - q[i] + mod) % mod ;
for(int i = 0; i <= C; i ++) B[i][sq] = (M[C][i] + tag[i]) % mod ;
}
Q = gi() ;
while(Q --) {
int l = gi() , r = gi() ;
for(int i = 0; i <= C; i ++) f1[i] = B[i][l - 1] ;
for(int i = 0; i <= C; i ++) f2[i] = A[i][r] ;
Ans = 0 ;
for(int i = 0; i <= C; i ++) Ans = (Ans + 1ll * f1[i] * f2[i] % mod) % mod ;
printf("%lld\n" , Ans) ;
}
return 0 ;
}