#include <bits/stdc++.h>
#include <iostream>
using namespace std;
#define mp make_pair
#define pb push_back
#define ppb pop_back
#define eb emplace_back
#define e1 first
#define e2 second
#define For(a, b, i) for(int i=a;i<b; ++i)
#define Dfor(a, b, i) for(int i=a;i>=b; --i)
typedef long long int ll;
typedef unsigned long long int ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<pii, pii> pp;
const int mod=1e9+7;
const int inf=1e9+9;
const int mod69=1e9+696969;
#define maxn 1000010
char t[maxn];
int n,d[maxn],l,k=0;ll wyn=0;
inline int readS(char *a)//funkcja zwraca liczbę znaków
{
int dl=0;
register char c = 0;
while (c < 33) c=getchar_unlocked();
dl = 0; //zmienna będzie przechowywać liczbę znaków
while (c>=32) {
a[dl++] = c;
c=getchar_unlocked();
}
a[dl]=0; //ustawienie końca ciągu znaków
return dl; //zwrócenie liczby znaków
}
void wczytaj()
{
scanf("%d", &n);
readS(t);
l=strlen(t);
///printf("%d\n", l);
For(0, l, i) if(t[i]=='(') k++;
///printf("%d\n", k);
}
void sprawdz()
{
bool p=false;
int q=0;
For(0, l, i)
{
int w=0;
if(t[i]=='^' || t[i]==' ') i++;
if(t[i]=='(') p=true,i++;
else if(t[i]==')') p=false,i++;
if(p==true)
{
///printf("%d\n", i);
int x=i;
For(x, l, i)
{
if(t[i]==')') {p=false;break;}
int h=0;
if(t[i]=='v') i++;
if(t[i]=='~') h++,i++;
if(t[i]=='x')
{
i++;
///printf("%c%c %d\n", t[i-1], t[i], (d[t[i]-'0'-1]+h)%2);
if((d[t[i]-'0'-1]+h)%2 == 1) w++;
///if(f==true) break;
}
///if(f==true) break;
}
if(w>=1) q++;
}
}
if(q==k) wyn++;
///if(w==k) For(0, n, i) printf("%d ", d[i]);puts("");
///printf("%d\n", q);
}
int main()
{
wczytaj();
ll r=1<<n;
For(0, r, i)
{
For(0, n, j)
{
if( (i & (1<<j) ) != 0) d[j]=1;
else d[j]=0;
}
///For(0, n, j) printf("%d ", d[j]);puts("");
sprawdz();
}
printf("%lld", wyn);
}
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include <bits/stdc++.h> #include <iostream> using namespace std; #define mp make_pair #define pb push_back #define ppb pop_back #define eb emplace_back #define e1 first #define e2 second #define For(a, b, i) for(int i=a;i<b; ++i) #define Dfor(a, b, i) for(int i=a;i>=b; --i) typedef long long int ll; typedef unsigned long long int ull; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef pair<pii, pii> pp; const int mod=1e9+7; const int inf=1e9+9; const int mod69=1e9+696969; #define maxn 1000010 char t[maxn]; int n,d[maxn],l,k=0;ll wyn=0; inline int readS(char *a)//funkcja zwraca liczbę znaków { int dl=0; register char c = 0; while (c < 33) c=getchar_unlocked(); dl = 0; //zmienna będzie przechowywać liczbę znaków while (c>=32) { a[dl++] = c; c=getchar_unlocked(); } a[dl]=0; //ustawienie końca ciągu znaków return dl; //zwrócenie liczby znaków } void wczytaj() { scanf("%d", &n); readS(t); l=strlen(t); ///printf("%d\n", l); For(0, l, i) if(t[i]=='(') k++; ///printf("%d\n", k); } void sprawdz() { bool p=false; int q=0; For(0, l, i) { int w=0; if(t[i]=='^' || t[i]==' ') i++; if(t[i]=='(') p=true,i++; else if(t[i]==')') p=false,i++; if(p==true) { ///printf("%d\n", i); int x=i; For(x, l, i) { if(t[i]==')') {p=false;break;} int h=0; if(t[i]=='v') i++; if(t[i]=='~') h++,i++; if(t[i]=='x') { i++; ///printf("%c%c %d\n", t[i-1], t[i], (d[t[i]-'0'-1]+h)%2); if((d[t[i]-'0'-1]+h)%2 == 1) w++; ///if(f==true) break; } ///if(f==true) break; } if(w>=1) q++; } } if(q==k) wyn++; ///if(w==k) For(0, n, i) printf("%d ", d[i]);puts(""); ///printf("%d\n", q); } int main() { wczytaj(); ll r=1<<n; For(0, r, i) { For(0, n, j) { if( (i & (1<<j) ) != 0) d[j]=1; else d[j]=0; } ///For(0, n, j) printf("%d ", d[j]);puts(""); sprawdz(); } printf("%lld", wyn); } |
English