QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#756356#9536. Athlete Welcome CeremonyStelorTL 0ms0kbC++173.1kb2024-11-16 20:04:452024-11-16 20:04:45

Judging History

This is the latest submission verdict.

  • [2024-11-16 20:04:45]
  • Judged
  • Verdict: TL
  • Time: 0ms
  • Memory: 0kb
  • [2024-11-16 20:04:45]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll mod=1e9+7;
ll dp[310][310][310][3];
ll pre[310][310][310];
int cnt[3];
void solve(){
    int n,q;
    cin >> n >> q;
    string s;
    cin >> s;
    s="#"+s;
    for(int i=1;i<=n;++i){
        cnt[i]=cnt[i-1]+(s[i]=='?');
    }
    if(s[1]=='?'){
        dp[1][1][0][0]=dp[1][0][1][1]=dp[1][0][0][2]=1;
    }else{
        dp[1][0][0][s[1]-'a']=1;
    }
    for(int i=2;i<=n;++i){
        for(int j=0;j<=300;++j){
            for(int k=0;k<=300;++k){
                if(s[i]!='?'){
                    ll tmp=dp[i-1][j][k][0]+dp[i-1][j][k][1]+dp[i-1][j][k][2];
                    dp[i][j][k][s[i]-'a']+=tmp-dp[i-1][j][k][s[i]-'a'];
                    dp[i][j][k][s[i]-'a']%=mod;
                }else{
                    if(j>=1){
                        dp[i][j][k][0]+=dp[i-1][j-1][k][1];
                        dp[i][j][k][0]+=dp[i-1][j-1][k][2];
                        dp[i][j][k][0]%=mod;
                    }
                    if(k>=1){
                        dp[i][j][k][1]+=dp[i-1][j][k-1][0];
                        dp[i][j][k][1]+=dp[i-1][j][k-1][2];
                        dp[i][j][k][1]%=mod;
                    }
                    if(cnt[i]-j-k>=1){
                        dp[i][j][k][2]+=dp[i-1][j][k][0];
                        dp[i][j][k][2]+=dp[i-1][j][k][1];
                        dp[i][j][k][2]%=mod;
                    }
                    
                }
            }
        }
    }
    for(int i=0;i<=300;++i){
        for(int j=0;j<=300;++j){
            if(cnt[n]-i-j>=0)
            pre[i][j][cnt[n]-i-j]=dp[n][i][j][0]+dp[n][i][j][1]+dp[n][i][j][2];
            pre[i][j][cnt[n]-i-j]%=mod;
        }
    }
    for(int i=0;i<=300;++i){
        for(int j=0;j<=300;++j){
            for(int k=0;k<=300;++k){
                if(i>=1){
                    pre[i][j][k]+=pre[i-1][j][k];
                    pre[i][j][k]%=mod;
                }
                if(j>=1){
                    pre[i][j][k]+=pre[i][j-1][k];
                    pre[i][j][k]%=mod;
                }
                if(k>=1){
                    pre[i][j][k]+=pre[i][j][k-1];
                    pre[i][j][k]%=mod;
                }
                if(i>=1&&j>=1){
                    pre[i][j][k]-=pre[i-1][j-1][k];
                    pre[i][j][k]+=mod;
                    pre[i][j][k]%=mod;
                }
                if(i>=1&&k>=1){
                    pre[i][j][k]-=pre[i-1][j][k-1];
                    pre[i][j][k]+=mod;
                    pre[i][j][k]%=mod;
                }
                if(k>=1&&j>=1){
                    pre[i][j][k]-=pre[i][j-1][k-1];
                    pre[i][j][k]+=mod;
                }
                if(i>=1&&j>=1&&k>=1){
                    pre[i][j][k]+=pre[i-1][j-1][k-1];
                    pre[i][j][k]%=mod;
                }
            }
        }
    }

    while(q--){
        int a,b,c;
        cin >> a >> b >> c;
        cout<<pre[a][b][c]<<'\n';
    }  
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return 0;
}

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

6 3
a?b??c
2 2 2
1 1 1
1 0 2

output:


result: