Submission #23495


ソースコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<bits/stdc++.h>
#define WARU 1000000007
using namespace std;
int memo[101][101][2],n,a[101];
char c[100];
long long int f(int l,int r,int num);
main(){
memset(memo,-1,sizeof(memo));
while(1){
scanf("%d%c",&a[n],&c[n]);
n++;
if(c[n-1]=='\n')break;
}
cout<<f(0,n-1,1)<<endl;
}
long long int f(int l,int r,int num){
if(memo[l][r][num]!=-1)return memo[l][r][num];
if(r-l==0){
return memo[l][r][num]=(a[l]==num);
}
else if(r-l==1){
int result;
if(c[l]=='&')result=a[l]&a[r];
else if(c[l]=='|')result=a[l]|a[r];
else result=a[l]^a[r];
return memo[l][r][num]=(result==num);
}
else{
long long int tmp,sum=0;
long long int lf,lt,rf,rt;
for(int i=l;i<r;i++){
lf=f(l,i,0);
lt=f(l,i,1);
rf=f(i+1,r,0);
rt=f(i+1,r,1);
if(c[i]=='&'){
if(num==1)tmp=(lt*rt)%WARU;
else tmp=((lt*rf)%WARU+(lf*rt)%WARU+(lf*rf)%WARU)%WARU;
sum=(sum+tmp)%WARU;
}
else if(c[i]=='|'){
if(num==1)tmp=((lt*rf)%WARU+(lf*rt)%WARU+(lt*rt)%WARU)%WARU;
else tmp=(lf*rf)%WARU;
sum=(sum+tmp)%WARU;
}
else{
if(num==1)tmp=((lt*rf)%WARU+(lf*rt)%WARU)%WARU;
else tmp=((lt*rt)%WARU+(lf*rf)%WARU)%WARU;
sum=(sum+tmp)%WARU;
}
}
return memo[l][r][num]=sum;
}
}

ステータス

項目 データ
問題 0570 - 1
ユーザー名 ei1516
投稿日時 2017-07-28 11:26:34
言語 C++11
状態 Accepted
得点 1
ソースコード長 1314 Byte
最大実行時間 45 ms
最大メモリ使用量 644 KB

セット

セット 得点 Cases
1 ALL 1 / 1 *

テストケース

ファイル名 状態 実行時間 メモリ使用量 #
00.in AC 45 ms 480 KB
1
01.in AC 28 ms 628 KB
1
02.in AC 16 ms 644 KB
1
03.in AC 16 ms 532 KB
1
04.in AC 16 ms 544 KB
1