# [LOJ6074] 子序列

题目大意

https://loj.ac/problem/6074

我才懒得写呢......

题解

妙到让我跑来单独(水)一篇题解。
首先我们可以有一些令人窒息的操作:

然后我们可以有一些更加令人窒息的操作:

上述内容摘自租酥雨的课件,所以貌似我什么都没写,因为我才懒得写呢
主要是复杂度\(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 ; 
}

猜你喜欢

转载自www.cnblogs.com/GuessYCB/p/10203542.html