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 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include<bits/stdc++.h> using namespace std; #ifdef LOCAL #define debug(...) fprintf(stdout, ##__VA_ARGS__) #else #define debug(...) void(0) #endif #define int long long inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'|| ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;} #define Z(x) (x)*(x) #define pb push_back #define fi first #define se second
#define N 5010 #define M 600010
int n, m, i, j, k, T; int a[N], c[N], cnt[M], q, c1, c2, s, t; char str[N];
int zh(int *a) { int i, ans=0; for(i=n; i>=1; --i) ans=ans*3+a[i]; return ans; }
int dfs(int k, int s) { if(k==0) return debug("Que : %lld\n", s), cnt[s]; if(str[k]=='A') return dfs(k-1, s*3+0)+dfs(k-1, s*3+1); if(str[k]=='O') return dfs(k-1, s*3+0); if(str[k]=='X') return dfs(k-1, s*3+0)+dfs(k-1, s*3+2); if(str[k]=='a') return dfs(k-1, s*3+2); if(str[k]=='o') return dfs(k-1, s*3+1)+dfs(k-1, s*3+2); if(str[k]=='x') return dfs(k-1, s*3+1); }
signed main() { #ifdef LOCAL freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif
n=read(); m=read(); q=read(); for(i=1; i<=m; ++i) k=read(), c[k]++; for(s=0; s<(1<<n); ++s) for(t=0; t<(1<<n); ++t) { for(i=1; i<=n; ++i) { c1=(s>>i-1)&1, c2=(t>>i-1)&1; a[i]=c1+c2; } if(c[s]*c[t]) cnt[zh(a)]+=c[s]*c[t], debug("%lld * %lld => %lld\n", s, t, zh(a)); } while(q--) { scanf("%s", str+1); reverse(str+1, str+n+1); printf("%lld\n", dfs(n, 0)); } return 0; }
|