QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#702001 | #9536. Athlete Welcome Ceremony | ucup-team5296# | WA | 1ms | 10036kb | C++20 | 3.2kb | 2024-11-02 15:05:45 | 2024-11-02 15:05:47 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define eb emplace_back
#define ep emplace
#define pii pair<int,int>
#define fi first
#define se second
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define mems(arr,x) memset(arr,x,sizeof(arr))
#define memc(arr1,arr2) memcpy(arr1,arr2,sizeof(arr2))
using namespace std;
const int maxn=310,mod=1e9+7;
bool mem1;
int n,q;
char s[maxn];
int dp[2][maxn][maxn][3];
int ss[maxn][maxn][maxn];
namespace FastMod{
inline void madd(int &x,int y){x+=y;(x>=mod)&&(x-=mod);}
inline void mdel(int &x,int y){x-=y;(x<0)&&(x+=mod);}
inline void mmul(int &x,int y){x=1ll*x*y%mod;}
inline int imadd(int x,int y){madd(x,y);return x;}
inline int imdel(int x,int y){mdel(x,y);return x;}
inline int immul(int x,int y){mmul(x,y);return x;}
inline int qpow(int x,int y){int res=1;while(y){if(y&1) res=1ll*res*x%mod;x=1ll*x*x%mod;y>>=1;}return res;}
}
using namespace FastMod;
int sum[maxn];
bool mem2;
int main(){
// debug("%.2fMB\n",abs(&mem1-&mem2)/1024./1024);
scanf("%d%d%s",&n,&q,s+1);
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+(s[i]=='?');
if(s[1]=='a'||s[1]=='?') dp[1][s[1]=='?'][0][0]=1;
if(s[1]=='b'||s[1]=='?') dp[1][0][s[1]=='?'][1]=1;
if(s[1]=='c'||s[1]=='?') dp[1][0][0][2]=1;
for(int i=2;i<=n;i++){
mems(dp[i&1],0);
for(int a=0;a<=sum[i];a++){
for(int b=0;a+b<=sum[i];b++){
int c=sum[i]-a-b;
if(s[i]=='a'||s[i]=='?'){
bool o=s[i]=='?';
for(int j:{1,2}) madd(dp[i&1][a+o][b][0],dp[(i-1)&1][a][b][j]);
}
if(s[i]=='b'||s[i]=='?'){
bool o=s[i]=='?';
for(int j:{0,2}) madd(dp[i&1][a][b+o][1],dp[(i-1)&1][a][b][j]);
}
if(s[i]=='c'||s[i]=='?')
for(int j:{0,1}) madd(dp[i&1][a][b][2],dp[(i-1)&1][a][b][j]);
}
}
}
for(int a=0;a<=sum[n];a++)
for(int b=0;b<=sum[n];b++)
ss[a][b][sum[n]-a-b]=imadd(dp[n&1][a][b][0],imadd(dp[n&1][a][b][1],dp[n&1][a][b][2]));
// printf("%d %d %d : %d\n",a,b,c,ss[a][b][c]);
int sn=sum[n];
for (int i = 0; i <= sn; ++i) {
for (int j = 0; j <= sn; ++j) {
for (int k = 0; k <= sn; ++k) {
// ss[i][j][k] = dp[n&1][i][j][k];
if (i > 0) ss[i][j][k] += ss[i-1][j][k];
if (j > 0) ss[i][j][k] += ss[i][j-1][k];
if (k > 0) ss[i][j][k] += ss[i][j][k-1];
if (i > 0 && j > 0) ss[i][j][k] -= ss[i-1][j-1][k];
if (i > 0 && k > 0) ss[i][j][k] -= ss[i-1][j][k-1];
if (j > 0 && k > 0) ss[i][j][k] -= ss[i][j-1][k-1];
if (i > 0 && j > 0 && k > 0) ss[i][j][k] += ss[i-1][j-1][k-1];
}
}
}
while(q--){
int x,y,z,ans=0;scanf("%d%d%d",&x,&y,&z);
ans=ss[x][y][z];
// for(int i=0;i<=x;i++)
// for(int j=0;j<=y;j++)
// if(sum[n]-i-j<=z)
// for(int k:{0,1,2})
// madd(ans,dp[n&1][i][j][k]);
printf("%d\n",ans);
}
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 9352kb
input:
6 3 a?b??c 2 2 2 1 1 1 1 0 2
output:
3 1 1
result:
ok 3 lines
Test #2:
score: 0
Accepted
time: 0ms
memory: 10036kb
input:
6 3 ?????? 2 2 2 2 3 3 3 3 3
output:
30 72 96
result:
ok 3 lines
Test #3:
score: 0
Accepted
time: 1ms
memory: 5852kb
input:
1 1 ? 0 1 1
output:
2
result:
ok single line: '2'
Test #4:
score: -100
Wrong Answer
time: 1ms
memory: 8112kb
input:
10 10 acab?cbaca 0 2 0 1 1 2 4 2 3 1 1 1 3 5 1 0 5 2 2 2 0 1 2 5 4 3 0 1 1 3
output:
0 0 0 1 0 0 0 0 0 0
result:
wrong answer 2nd lines differ - expected: '1', found: '0'