Problem:
D: Statement Coverage / 命令網羅
「うわっ！なんてひどいコードだ！」
古いソースコードを開きながら先輩が叫んでいる． また面倒な仕事が押し付けられそうだ……．
ソースコードにはめまいがしそうなほどたくさんの if 文が並んでいる．
if 条件文 1; 命令 1
if 条件文 2; 命令 2
if 条件文 3; 命令 3
...
どうやら制御の構造はそれほど複雑ではないらしい．
1 つの条件文には，変数と NOT 演算子 "~" ，そして AND "&" / OR "|" の 2 項演算子が現れる． 変数は真または偽を表し，変数名は1文字以上のアルファベットで表される． 演算の順序は NOT 演算子が優先だが，括弧で先に計算するよう順序を変えてもよい． 変数は 1 つもしくは 2 つ，2 項演算は高々 1 回，それ以外は何度でも現れて良い．
とりあえずコンパイルは通った． コードを修正する前にテストを書く必要がある． 今回頼まれたのは，このコードのテストケースを書く作業だ． テストケースの数は，全ての命令が 1 度以上実行されれば十分である． テストケースの数を見積もって， 1 つで済むようなら引き受けることにしよう．
Input
与えられる入力は以下のように表される．
N
M
cond
1
;
cond
2
;
...
cond
N
;
N
( 1 ≦
N
≦ 500 ) 行の条件文が現れ，条件文中には
M
( 1 ≦
M
≦ 500 ) 種類の変数が存在する． 条件文
cond
i
は最大 1000 文字である． また，変数名は10文字を超えない．
Output
作業を引き受けるなら accept，拒否するなら reject を 1 行出力せよ．
Sample Input 1
3 4
~~(~A|B);
~(~C&~D);
~(~A|~~D);
Sample Output 1
accept
Sample Input 2
2 1
var;
~var;
Sample Output 2
reject

Submitted solutions:

code_snippet: #include <cassert>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <fstream>

using namespace std;

typedef pair<int,int> pii;
typedef long long ll;
typedef pair<bool,string> part;
typedef pair<part,part> ppp;
typedef pair<bool,ppp> cls;

int N,M;
string strs[511];

part analize1(const string s){
  {
    int cnt=0;
    // テ」ツつ「テ」ツδォテ」ツδ陛」ツつ。テ」ツδ凖」ツδε」ツδ暗」ツ??」ツ?妥」ツ?ョテヲツ鳴?・ツュツ療・ツ按療」ツ?ェテ」ツつ嘉」ツ??」ツ?敕」ツ?ョテ」ツ?セテ」ツ?セテヲツ按サテ」ツ??
    for(int i=0;i<(int)s.size();i++)
      if(isalpha(s[i]))
        cnt++;
    if(cnt==(int)s.size())
      return part(true,s);
  }
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1)
      return analize1(s.substr(1,(int)s.size()-2));
  }
  // not
  if(s[0]=='~'){
    part p=analize1(s.substr(1));
    p.first^=1;
    return p;
  }
}

cls analize2(const string s){
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize2(s.substr(1,(int)s.size()-2));
    }
  }
  // 2テゥツ??ヲツシツ氾ァツョツ療・ツュツ静」ツつ津ヲツ篠「テ」ツ??
  {
    int cnt=0;
    for(int i=0;i<(int)s.size();i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
      else if(cnt==0){
        // split
        if(s[i]=='|'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(false,p3);
          return res;
        }
        else if(s[i]=='&'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(true,p3);
          return res;
        }
      }
    }
  }
  // not
  if(s[0]=='~'){
    cls p=analize2(s.substr(1));
    p.first^=1;
    p.second.first.first^=1;
    p.second.second.first^=1;
    return p;
  }
}


class TwoSat{
private:
  static const int MAX_V=100000;
  vector<int> G[MAX_V];
  vector<int> rG[MAX_V];
  bool used[MAX_V];
  int cmp[MAX_V];
  vector<int> vs;
  int V;
  void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  void dfs(int s){
    used[s]=true;
    for(int i=0;i<(int)G[s].size();i++){
      int to=G[s][i];
      if(!used[to])dfs(to);
    }
    vs.push_back(s);
  }
  void rdfs(int s,int k){
    used[s]=true;
    cmp[s]=k;
    for(int i=0;i<(int)rG[s].size();i++){
      int to=rG[s][i];
      if(!used[to]){
        rdfs(to,k);
      }
    }
  }
  int makeGraph(int N){
    vs.clear();
    memset(used,0,sizeof(used));
    for(int i=0;i<N;i++)
      if(!used[i])dfs(i);
    memset(used,0,sizeof(used));
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)
      if(!used[vs[i]])rdfs(vs[i],k++);
    return k;
  }
public:
  int Not(int a){
    if(a>=V/2)return a-V/2;
    return a+V/2;
  }
  void init(int V_){
    V=2*V_;
    for(int i=0;i<V;i++)
      G[i].clear(),rG[i].clear();
  }
  void addClosure(int a,int b){
    add_edge(Not(b),a);
    add_edge(Not(a),b);
  }
  bool isSat(){
    makeGraph(V);
    for(int i=0;i<V/2;i++)
      if(cmp[i]==cmp[Not(i)])
        return false;
    return true;
  }
};

TwoSat ts;

int main(){
  
  map<string,int> node;
  int V=1;
  cin>>N>>M;
  for(int i=0;i<N;i++){
    cin>>strs[i];
    strs[i]=strs[i].substr(0,(int)strs[i].size()-1);
  }
  ts.init(2000);
  ts.addClosure(ts.Not(0),ts.Not(0));
  for(int i=0;i<N;i++){
    // テ」ツ?禿」ツ?ョテヲツ鳴?」ツ?古・ツ、ツ嘉ヲツ閉ーテ」ツつ?,2テ・ツ?凝」ツ?ゥテ」ツ?。テ」ツつ嘉」ツ?凝」ツ?ァテ・ツ?エテ・ツ青暗・ツ按?」ツ??
    bool isAnd=false;
    bool isOr=false;
    string &s=strs[i];
    for(int j=0;j<(int)s.size();j++)
      if(s[j]=='|')isOr=true;
      else if(s[j]=='&')isAnd=true;
    if(isAnd||isOr){
      cls c=analize2(s);
      isAnd=isOr=false;
      if(c.first)isAnd=true;
      else isOr=true;
      if(node.count(c.second.first.second)==0)
        node[c.second.first.second]=V++;
      if(node.count(c.second.second.second)==0)
        node[c.second.second.second]=V++;
      ppp p=c.second;
      int a=node[p.first.second];
      int b=node[p.second.second];
      if(!p.first.first)a=ts.Not(a);
      if(!p.second.first)b=ts.Not(b);
      if(isOr)ts.addClosure(a,b);
      else{
        ts.addClosure(0,a);
        ts.addClosure(0,b);
      }
    }
    else{
      part p=analize1(s);
      if(node.count(p.second)==0)
        node[p.second]=V++;
      int a=node[p.second];
      if(!p.first)a=ts.Not(a);
      ts.addClosure(0,a);
    }
  }
  if(ts.isSat())cout<<"accept"<<endl;
  else cout<<"reject"<<endl;
  
  return 0;
}
accuracy: 0.10344827586206896
time_ms: 20
memory_kb: 6096
final_rank: 9

code_snippet: #include <cassert>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <fstream>

using namespace std;

typedef pair<int,int> pii;
typedef long long ll;
typedef pair<bool,string> part;
typedef pair<part,part> ppp;
typedef pair<bool,ppp> cls;

int N,M;
string strs[511];

part analize1(const string &s){
  {
    int cnt=0;
    // テ」ツつ「テ」ツδォテ」ツδ陛」ツつ。テ」ツδ凖」ツδε」ツδ暗」ツ??」ツ?妥」ツ?ョテヲツ鳴?・ツュツ療・ツ按療」ツ?ェテ」ツつ嘉」ツ??」ツ?敕」ツ?ョテ」ツ?セテ」ツ?セテヲツ按サテ」ツ??
    for(int i=0;i<(int)s.size();i++)
      if(isalpha(s[i]))
        //if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
        cnt++;
    if(cnt==(int)s.size())
      return part(true,s);
  }
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1)
      return analize1(s.substr(1,(int)s.size()-2));
  }
  // not
  if(s[0]=='~'){
    part p=analize1(s.substr(1));
    p.first^=1;
    return p;
  }
}

cls analize2(const string &s){
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize2(s.substr(1,(int)s.size()-2));
    }
  }
  // 2テゥツ??ヲツシツ氾ァツョツ療・ツュツ静」ツつ津ヲツ篠「テ」ツ??
  {
    int cnt=0;
    for(int i=0;i<(int)s.size();i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
      else if(cnt==0){
        // split
        if(s[i]=='|'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(false,p3);
          return res;
          //return ppp(p1,p2);
        }
        else if(s[i]=='&'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(true,p3);
          return res;
          //return ppp(p1,p2);
        }
      }
    }
  }
  // not
  if(s[0]=='~'){
    cls p=analize2(s.substr(1));
    p.first^=1;
    p.second.first.first^=1;
    p.second.second.first^=1;
    return p;
  }
}


class TwoSat{
private:
  static const int MAX_V=100000;
  vector<int> G[MAX_V];
  vector<int> rG[MAX_V];
  bool used[MAX_V];
  int cmp[MAX_V];
  vector<int> vs;
  int V;
  void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  void dfs(int s){
    used[s]=true;
    for(int i=0;i<(int)G[s].size();i++){
      int to=G[s][i];
      if(!used[to])dfs(to);
    }
    vs.push_back(s);
  }
  void rdfs(int s,int k){
    used[s]=true;
    cmp[s]=k;
    for(int i=0;i<(int)rG[s].size();i++){
      int to=rG[s][i];
      if(!used[to]){
        rdfs(to,k);
      }
    }
  }
  int makeGraph(int N){
    vs.clear();
    memset(used,0,sizeof(used));
    for(int i=0;i<N;i++)
      if(!used[i])dfs(i);
    memset(used,0,sizeof(used));
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)
      if(!used[vs[i]])rdfs(vs[i],k++);
    return k;
  }
public:
  int Not(int a){
    if(a>=V/2)return a-V/2;
    return a+V/2;
  }
  void init(int V_){
    V=2*V_;
    for(int i=0;i<V;i++)
      G[i].clear(),rG[i].clear();
  }
  void addClosure(int a,int b){
    add_edge(Not(b),a);
    add_edge(Not(a),b);
  }
  bool isSat(){
    makeGraph(V);
    for(int i=0;i<V/2;i++)
      if(cmp[i]==cmp[Not(i)])
        return false;
    return true;
  }
};

TwoSat ts;

int main(){
  
  map<string,int> node;
  int V=1;
  cin>>N>>M;
  for(int i=0;i<N;i++){
    cin>>strs[i];
    strs[i]=strs[i].substr(0,(int)strs[i].size()-1);
  }
  ts.init(2000);
  ts.addClosure(ts.Not(0),ts.Not(0));
  for(int i=0;i<N;i++){
    // テ」ツ?禿」ツ?ョテヲツ鳴?」ツ?古・ツ、ツ嘉ヲツ閉ーテ」ツつ?,2テ・ツ?凝」ツ?ゥテ」ツ?。テ」ツつ嘉」ツ?凝」ツ?ァテ・ツ?エテ・ツ青暗・ツ按?」ツ??
    bool isAnd=false;
    bool isOr=false;
    string &s=strs[i];
    for(int j=0;j<(int)s.size();j++)
      if(s[j]=='|')isOr=true;
      else if(s[j]=='&')isAnd=true;
    if(isAnd||isOr){
      cls c=analize2(s);
      isAnd=isOr=false;
      if(c.first)isAnd=true;
      else isOr=true;
      if(node.count(c.second.first.second)==0)
        node[c.second.first.second]=V++;
      if(node.count(c.second.second.second)==0)
        node[c.second.second.second]=V++;
      ppp p=c.second;
      int a=node[p.first.second];
      int b=node[p.second.second];
      if(!p.first.first)a=ts.Not(a);
      if(!p.second.first)b=ts.Not(b);
      //cout<<isOr<<" "<<isAnd<<endl;
      if(isOr){
        //cout<<a<<" "<<b<<endl;
        ts.addClosure(a,b);
      }
      else{
        ts.addClosure(0,a);
        ts.addClosure(0,b);
      }
    }
    else{
      part p=analize1(s);
      if(node.count(p.second)==0)
        node[p.second]=V++;
      int a=node[p.second];
      if(!p.first)a=ts.Not(a);
      ts.addClosure(0,a);
    }
  }
  //cerr<<"ok"<<endl;
  //cout<<V<<endl;
  if(ts.isSat())cout<<"accept"<<endl;
  else cout<<"reject"<<endl;
  
  return 0;
}
accuracy: 0.10344827586206896
time_ms: 20
memory_kb: 6100
final_rank: 10

code_snippet: #include <cassert>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <fstream>

using namespace std;

typedef pair<int,int> pii;
typedef long long ll;
typedef pair<bool,string> part;
typedef pair<part,part> ppp;
typedef pair<bool,ppp> cls;

int N,M;
string strs[511];

part analize1(const string &s){
  {
    int cnt=0;
    // アルファベットだけの文字列なら、そのまま戻す
    for(int i=0;i<(int)s.size();i++)
      if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
        cnt++;
    if(cnt==(int)s.size()){
      return part(true,s);
    }
  }
  // 括弧
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1)
      return analize1(s.substr(1,(int)s.size()-2));
  }
  // not
  if(s[0]=='~'){
    part p=analize1(s.substr(1));
    p.first^=1;
    return p;
  }
  cout<<"a"<<endl;
  //assert(0);
  //return part(0,0);
}

cls analize2(const string &s){
  // 括弧
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize2(s.substr(1,(int)s.size()-2));
    }
  }
  // 2項演算子を探す
  {
    int cnt=0;
    for(int i=0;i<(int)s.size();i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
      else if(cnt==0){
        // split
        if(s[i]=='|'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(false,p3);
          return res;
          //return ppp(p1,p2);
        }
        else if(s[i]=='&'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(true,p3);
          return res;
          //return ppp(p1,p2);
        }
      }
    }
  }
  // not
  if(s[0]=='~'){
    cls p=analize2(s.substr(1));
    p.first^=1;
    p.second.first.first^=1;
    p.second.second.first^=1;
    return p;
  }
  cout<<"a"<<endl;
}


class TwoSat{
private:
  static const int MAX_V=100000;
  vector<int> G[MAX_V];
  vector<int> rG[MAX_V];
  bool used[MAX_V];
  int cmp[MAX_V];
  vector<int> vs;
  int V;
  void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  void dfs(int s){
    used[s]=true;
    for(int i=0;i<(int)G[s].size();i++){
      int to=G[s][i];
      if(!used[to])dfs(to);
    }
    vs.push_back(s);
  }
  void rdfs(int s,int k){
    used[s]=true;
    cmp[s]=k;
    for(int i=0;i<(int)rG[s].size();i++){
      int to=rG[s][i];
      if(!used[to]){
        rdfs(to,k);
      }
    }
  }
  int makeGraph(int N){
    vs.clear();
    memset(used,0,sizeof(used));
    for(int i=0;i<N;i++)
      if(!used[i])dfs(i);
    memset(used,0,sizeof(used));
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)
      if(!used[vs[i]])rdfs(vs[i],k++);
    return k;
  }
public:
  int Not(int a){
    if(a>=V/2)return a-V/2;
    return a+V/2;
  }
  void init(int V_){
    V=2*V_;
    for(int i=0;i<V;i++)
      G[i].clear(),rG[i].clear();
  }
  void addClosure(int a,int b){
    add_edge(Not(b),a);
    add_edge(Not(a),b);
  }
  bool isSat(){
    makeGraph(V);
    for(int i=0;i<V/2;i++)
      if(cmp[i]==cmp[Not(i)])
        return false;
    return true;
  }
};

TwoSat ts;

int main(){
  
  map<string,int> node;
  int V=1;
  cin>>N>>M;
  for(int i=0;i<N;i++){
    cin>>strs[i];
    strs[i]=strs[i].substr(0,(int)strs[i].size()-1);
  }
  ts.init(2000);
  ts.addClosure(ts.Not(0),ts.Not(0));
  for(int i=0;i<N;i++){
    // この文が変数を1,2個どちらかで場合分け
    bool isAnd=false;
    bool isOr=false;
    string &s=strs[i];
    for(int j=0;j<(int)s.size();j++)
      if(s[j]=='|')isOr=true;
      else if(s[j]=='&')isAnd=true;
    if(isAnd||isOr){
      cls c=analize2(s);
      isAnd=isOr=false;
      if(c.first)isAnd=true;
      else isOr=true;
      if(node.count(c.second.first.second)==0)
        node[c.second.first.second]=V++;
      if(node.count(c.second.second.second)==0)
        node[c.second.second.second]=V++;
      ppp p=c.second;
      int a=node[p.first.second];
      int b=node[p.second.second];
      if(!p.first.first)a=ts.Not(a);
      if(!p.second.first)b=ts.Not(b);
      //cout<<isOr<<" "<<isAnd<<endl;
      if(isOr){
        //cout<<a<<" "<<b<<endl;
        ts.addClosure(a,b);
      }
      else{
        ts.addClosure(0,a);
        ts.addClosure(0,b);
      }
    }
    else{
      part p=analize1(s);
      if(node.count(p.second)==0)
        node[p.second]=V++;
      int a=node[p.second];
      if(!p.first)a=ts.Not(a);
      ts.addClosure(0,a);
    }
  }
  //cerr<<"ok"<<endl;
  //cout<<V<<endl;
  if(ts.isSat())cout<<"accept"<<endl;
  else cout<<"reject"<<endl;
  
  return 0;
}
accuracy: 0.10344827586206896
time_ms: 10
memory_kb: 6092
final_rank: 5

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <fstream>

using namespace std;

typedef pair<int,int> pii;
typedef long long ll;
typedef pair<bool,string> part;
typedef pair<part,part> ppp;
typedef pair<bool,ppp> cls;

int N,M;
string strs[511];

part analize1(const string &s){
  {
    //cout<<s<<endl;
    int cnt=0;
    // テ」ツつ「テ」ツδォテ」ツδ陛」ツつ。テ」ツδ凖」ツδε」ツδ暗」ツ??」ツ?妥」ツ?ョテヲツ鳴?・ツュツ療・ツ按療」ツ?ェテ」ツつ嘉」ツ??」ツ?敕」ツ?ョテ」ツ?セテ」ツ?セテヲツ按サテ」ツ??
    for(int i=0;i<(int)s.size();i++)
      if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
        cnt++;
    if(cnt==(int)s.size()){
      return part(true,s);
    }
  }
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize1(s.substr(1,(int)s.size()-2));
    }
  }
  // not
  if(s[0]=='~'){
    part p=analize1(s.substr(1));
    p.first^=1;
    return p;
  }  
  return part(0,0);
}

cls analize2(const string &s){
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize2(s.substr(1,(int)s.size()-2));
    }
  }
  // 2テゥツ??ヲツシツ氾ァツョツ療・ツュツ静」ツつ津ヲツ篠「テ」ツ??
  {
    int cnt=0;
    for(int i=0;i<(int)s.size();i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
      else if(cnt==0){
        // split
        if(s[i]=='|'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(false,p3);
          return res;
          //return ppp(p1,p2);
        }
        else if(s[i]=='&'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(true,p3);
          return res;
          //return ppp(p1,p2);
        }
      }
    }
  }
  // not
  if(s[0]=='~'){
    cls p=analize2(s.substr(1));
    p.first^=1;
    p.second.first.first^=1;
    p.second.second.first^=1;
    return p;
  }
}


class TwoSat{
private:
  static const int MAX_V=100000;
  vector<int> G[MAX_V];
  vector<int> rG[MAX_V];
  bool used[MAX_V];
  int cmp[MAX_V];
  vector<int> vs;
  int V;
  void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  void dfs(int s){
    used[s]=true;
    for(int i=0;i<(int)G[s].size();i++){
      int to=G[s][i];
      if(!used[to])dfs(to);
    }
    vs.push_back(s);
  }
  void rdfs(int s,int k){
    used[s]=true;
    cmp[s]=k;
    for(int i=0;i<(int)rG[s].size();i++){
      int to=rG[s][i];
      if(!used[to]){
        rdfs(to,k);
      }
    }
  }
  int makeGraph(int N){
    vs.clear();
    memset(used,0,sizeof(used));
    for(int i=0;i<N;i++)
      if(!used[i])dfs(i);
    memset(used,0,sizeof(used));
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)
      if(!used[vs[i]])rdfs(vs[i],k++);
    return k;
  }
public:
  int Not(int a){
    if(a>=V/2)return a-V/2;
    return a+V/2;
  }
  void init(int V_){
    V=2*V_;
    for(int i=0;i<V;i++)
      G[i].clear(),rG[i].clear();
  }
  void addClosure(int a,int b){
    add_edge(Not(b),a);
    add_edge(Not(a),b);
  }
  bool isSat(){
    makeGraph(V);
    for(int i=0;i<V/2;i++)
      if(cmp[i]==cmp[Not(i)])
        return false;
    return true;
  }
};

TwoSat ts;

int main(){
  
  map<string,int> node;
  int V=1;
  cin>>N>>M;
  for(int i=0;i<N;i++){
    cin>>strs[i];
    strs[i]=strs[i].substr(0,(int)strs[i].size()-1);
  }
  ts.init(2000);
  ts.addClosure(ts.Not(0),ts.Not(0));
  for(int i=0;i<N;i++){
    // テ」ツ?禿」ツ?ョテヲツ鳴?」ツ?古・ツ、ツ嘉ヲツ閉ーテ」ツつ?,2テ・ツ?凝」ツ?ゥテ」ツ?。テ」ツつ嘉」ツ?凝」ツ?ァテ・ツ?エテ・ツ青暗・ツ按?」ツ??
    bool isAnd=false;
    bool isOr=false;
    string &s=strs[i];
    for(int j=0;j<(int)s.size();j++)
      if(s[j]=='|')isOr=true;
      else if(s[j]=='&')isAnd=true;
    if(isAnd||isOr){
      cls c=analize2(s);
      isAnd=isOr=false;
      if(c.first)isAnd=true;
      else isOr=true;
      if(node.count(c.second.first.second)==0)
        node[c.second.first.second]=V++;
      if(node.count(c.second.second.second)==0)
        node[c.second.second.second]=V++;
      ppp p=c.second;
      int a=node[p.first.second];
      int b=node[p.second.second];
      if(!p.first.first)a=ts.Not(a);
      if(!p.second.first)b=ts.Not(b);
      //cout<<isOr<<" "<<isAnd<<endl;
      if(isOr){
        //cout<<a<<" "<<b<<endl;
        ts.addClosure(a,b);
      }
      else{
        ts.addClosure(0,a);
        ts.addClosure(0,b);
      }
    }
    else{
      
      part p=analize1(s);
      if(node.count(p.second)==0)
        node[p.second]=V++;
      int a=node[p.second];
      if(!p.first){
        a=ts.Not(a);
      }
      ts.addClosure(0,a);
    }
  }
  //cerr<<"ok"<<endl;
  //cout<<V<<endl;
  if(ts.isSat())cout<<"accept"<<endl;
  else cout<<"reject"<<endl;
  
  return 0;
}
accuracy: 0.10344827586206896
time_ms: 10
memory_kb: 6096
final_rank: 6

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <fstream>

using namespace std;

typedef pair<int,int> pii;
typedef long long ll;
typedef pair<bool,string> part;
typedef pair<part,part> ppp;
typedef pair<bool,ppp> cls;

int N,M;
string strs[511];

part analize1(const string &s){
  {
    //cout<<s<<endl;
    int cnt=0;
    // テ」ツつ「テ」ツδォテ」ツδ陛」ツつ。テ」ツδ凖」ツδε」ツδ暗」ツ??」ツ?妥」ツ?ョテヲツ鳴?・ツュツ療・ツ按療」ツ?ェテ」ツつ嘉」ツ??」ツ?敕」ツ?ョテ」ツ?セテ」ツ?セテヲツ按サテ」ツ??
    for(int i=0;i<(int)s.size();i++)
      if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
        cnt++;
    if(cnt==(int)s.size()){
      return part(true,s);
    }
  }
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize1(s.substr(1,(int)s.size()-2));
    }
  }
  // not
  if(s[0]=='~'){
    part p=analize1(s.substr(1));
    p.first^=1;
    return p;
  }  
  return part(0,0);
}

cls analize2(const string &s){
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize2(s.substr(1,(int)s.size()-2));
    }
  }
  // 2テゥツ??ヲツシツ氾ァツョツ療・ツュツ静」ツつ津ヲツ篠「テ」ツ??
  {
    int cnt=0;
    for(int i=0;i<(int)s.size();i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
      else if(cnt==0){
        // split
        if(s[i]=='|'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(false,p3);
          return res;
          //return ppp(p1,p2);
        }
        else if(s[i]=='&'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(true,p3);
          return res;
          //return ppp(p1,p2);
        }
      }
    }
  }
  // not
  if(s[0]=='~'){
    cls p=analize2(s.substr(1));
    p.first^=1;
    p.second.first.first^=1;
    p.second.second.first^=1;
    return p;
  }
}


class TwoSat{
private:
  static const int MAX_V=100000;
  vector<int> G[MAX_V];
  vector<int> rG[MAX_V];
  bool used[MAX_V];
  int cmp[MAX_V];
  vector<int> vs;
  int V;
  void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  void dfs(int s){
    used[s]=true;
    for(int i=0;i<(int)G[s].size();i++){
      int to=G[s][i];
      if(!used[to])dfs(to);
    }
    vs.push_back(s);
  }
  void rdfs(int s,int k){
    used[s]=true;
    cmp[s]=k;
    for(int i=0;i<(int)rG[s].size();i++){
      int to=rG[s][i];
      if(!used[to]){
        rdfs(to,k);
      }
    }
  }
  int makeGraph(int N){
    vs.clear();
    memset(used,0,sizeof(used));
    for(int i=0;i<N;i++)
      if(!used[i])dfs(i);
    memset(used,0,sizeof(used));
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)
      if(!used[vs[i]])rdfs(vs[i],k++);
    return k;
  }
public:
  int Not(int a){
    if(a>=V/2)return a-V/2;
    return a+V/2;
  }
  void init(int V_){
    V=2*V_;
    for(int i=0;i<V;i++)
      G[i].clear(),rG[i].clear();
  }
  void addClosure(int a,int b){
    add_edge(Not(b),a);
    add_edge(Not(a),b);
  }
  bool isSat(){
    makeGraph(V);
    for(int i=0;i<V/2;i++)
      if(cmp[i]==cmp[Not(i)])
        return false;
    return true;
  }
};

TwoSat ts;

int main(){
  
  map<string,int> node;
  int V=1;
  cin>>N>>M;
  for(int i=0;i<N;i++){
    cin>>strs[i];
    strs[i]=strs[i].substr(0,(int)strs[i].size()-1);
  }
  ts.init(2000);
  ts.addClosure(ts.Not(0),ts.Not(0));
  for(int i=0;i<N;i++){
    // テ」ツ?禿」ツ?ョテヲツ鳴?」ツ?古・ツ、ツ嘉ヲツ閉ーテ」ツつ?,2テ・ツ?凝」ツ?ゥテ」ツ?。テ」ツつ嘉」ツ?凝」ツ?ァテ・ツ?エテ・ツ青暗・ツ按?」ツ??
    bool isAnd=false;
    bool isOr=false;
    string &s=strs[i];
    for(int j=0;j<(int)s.size();j++)
      if(s[j]=='|')isOr=true;
      else if(s[j]=='&')isAnd=true;
    if(isAnd||isOr){
      cls c=analize2(s);
      isAnd=isOr=false;
      if(c.first)isAnd=true;
      else isOr=true;
      if(node.count(c.second.first.second)==0)
        node[c.second.first.second]=V++;
      if(node.count(c.second.second.second)==0)
        node[c.second.second.second]=V++;
      ppp p=c.second;
      int a=node[p.first.second];
      int b=node[p.second.second];
      if(!p.first.first)a=ts.Not(a);
      if(!p.second.first)b=ts.Not(b);
      //cout<<isOr<<" "<<isAnd<<endl;
      if(isOr){
        //cout<<a<<" "<<b<<endl;
        ts.addClosure(a,b);
      }
      else{
        ts.addClosure(0,a);
        ts.addClosure(0,b);
      }
    }
    else{
      
      part p=analize1(s);
      if(node.count(p.second)==0)
        node[p.second]=V++;
      int a=node[p.second];
      if(!p.first){
        a=ts.Not(a);
      }
      ts.addClosure(0,a);
    }
  }
  //cout<<V<<endl;
  if(ts.isSat())cout<<"accept"<<endl;
  else cout<<"reject"<<endl;
  
  return 0;
}
accuracy: 0.10344827586206896
time_ms: 10
memory_kb: 6100
final_rank: 7

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <fstream>

using namespace std;

typedef pair<int,int> pii;
typedef long long ll;
typedef pair<bool,string> part;
typedef pair<part,part> ppp;
typedef pair<bool,ppp> cls;

int N,M;
string strs[511];

part analize1(const string &s){
  {
    //cout<<s<<endl;
    int cnt=0;
    // テ」ツつ「テ」ツδォテ」ツδ陛」ツつ。テ」ツδ凖」ツδε」ツδ暗」ツ??」ツ?妥」ツ?ョテヲツ鳴?・ツュツ療・ツ按療」ツ?ェテ」ツつ嘉」ツ??」ツ?敕」ツ?ョテ」ツ?セテ」ツ?セテヲツ按サテ」ツ??
    for(int i=0;i<(int)s.size();i++)
      if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
        cnt++;
    if(cnt==(int)s.size()){
      return part(true,s);
    }
  }
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize1(s.substr(1,(int)s.size()-2));
    }
  }
  // not
  if(s[0]=='~'){
    part p=analize1(s.substr(1));
    p.first^=1;
    return p;
  }  
  return part(0,0);
}

cls analize2(const string &s){
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize2(s.substr(1,(int)s.size()-2));
    }
  }
  // 2テゥツ??ヲツシツ氾ァツョツ療・ツュツ静」ツつ津ヲツ篠「テ」ツ??
  {
    int cnt=0;
    for(int i=0;i<(int)s.size();i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
      else if(cnt==0){
        // split
        if(s[i]=='|'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(false,p3);
          return res;
          //return ppp(p1,p2);
        }
        else if(s[i]=='&'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(true,p3);
          return res;
          //return ppp(p1,p2);
        }
      }
    }
  }
  // not
  if(s[0]=='~'){
    cls p=analize2(s.substr(1));
    p.first^=1;
    p.second.first.first^=1;
    p.second.second.first^=1;
    return p;
  }
}


class TwoSat{
private:
  static const int MAX_V=100000;
  vector<int> G[MAX_V];
  vector<int> rG[MAX_V];
  bool used[MAX_V];
  int cmp[MAX_V];
  vector<int> vs;
  int V;
  void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  void dfs(int s){
    used[s]=true;
    for(int i=0;i<(int)G[s].size();i++){
      int to=G[s][i];
      if(!used[to])dfs(to);
    }
    vs.push_back(s);
  }
  void rdfs(int s,int k){
    used[s]=true;
    cmp[s]=k;
    for(int i=0;i<(int)rG[s].size();i++){
      int to=rG[s][i];
      if(!used[to]){
        rdfs(to,k);
      }
    }
  }
  int makeGraph(int N){
    vs.clear();
    memset(used,0,sizeof(used));
    for(int i=0;i<N;i++)
      if(!used[i])dfs(i);
    memset(used,0,sizeof(used));
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)
      if(!used[vs[i]])rdfs(vs[i],k++);
    return k;
  }
public:
  int Not(int a){
    if(a>=V/2)return a-V/2;
    return a+V/2;
  }
  void init(int V_){
    V=2*V_;
    for(int i=0;i<V;i++)
      G[i].clear(),rG[i].clear();
  }
  void addClosure(int a,int b){
    add_edge(Not(b),a);
    add_edge(Not(a),b);
  }
  bool isSat(){
    makeGraph(V);
    for(int i=0;i<V/2;i++)
      if(cmp[i]==cmp[Not(i)])
        return false;
    return true;
  }
};

TwoSat ts;

int main(){
  
  map<string,int> node;
  int V=1;
  cin>>N>>M;
  for(int i=0;i<N;i++){
    cin>>strs[i];
    strs[i]=strs[i].substr(0,(int)strs[i].size()-1);
  }
  ts.init(M+10);
  ts.addClosure(ts.Not(0),ts.Not(0));
  for(int i=0;i<N;i++){
    // テ」ツ?禿」ツ?ョテヲツ鳴?」ツ?古・ツ、ツ嘉ヲツ閉ーテ」ツつ?,2テ・ツ?凝」ツ?ゥテ」ツ?。テ」ツつ嘉」ツ?凝」ツ?ァテ・ツ?エテ・ツ青暗・ツ按?」ツ??
    bool isAnd=false;
    bool isOr=false;
    string &s=strs[i];
    for(int j=0;j<(int)s.size();j++)
      if(s[j]=='|')isAnd=true;
      else if(s[j]=='&')isOr=true;
    if(isAnd||isOr){
      cls c=analize2(s);
      isAnd=isOr=false;
      if(c.first)isAnd=true;
      else isOr=true;
      if(node.count(c.second.first.second)==0)
        node[c.second.first.second]=V++;
      if(node.count(c.second.second.second)==0)
        node[c.second.second.second]=V++;
      ppp p=c.second;
      int a=node[p.first.second];
      int b=node[p.second.second];
      if(!p.first.first)a=ts.Not(a);
      if(!p.second.first)b=ts.Not(b);
      //cout<<isOr<<" "<<isAnd<<endl;
      if(isOr){
        //cout<<a<<" "<<b<<endl;
        ts.addClosure(a,b);
      }
      else{
        ts.addClosure(0,a);
        ts.addClosure(0,b);
      }
    }
    else{
      
      part p=analize1(s);
      if(node.count(p.second)==0)
        node[p.second]=V++;
      int a=node[p.second];
      if(!p.first){
        a=ts.Not(a);
      }
      ts.addClosure(0,a);
    }
  }
  //cout<<V<<endl;
  if(ts.isSat())cout<<"accept"<<endl;
  else cout<<"reject"<<endl;
  
  return 0;
}
accuracy: 0.10344827586206896
time_ms: 10
memory_kb: 6052
final_rank: 4

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <fstream>

using namespace std;

typedef pair<int,int> pii;
typedef long long ll;
typedef pair<bool,string> part;
typedef pair<part,part> ppp;
typedef pair<bool,ppp> cls;

int N,M;
string strs[501];

part analize1(const string &s){
  {
    //cout<<s<<endl;
    int cnt=0;
    // テ」ツつ「テ」ツδォテ」ツδ陛」ツつ。テ」ツδ凖」ツδε」ツδ暗」ツ??」ツ?妥」ツ?ョテヲツ鳴?・ツュツ療・ツ按療」ツ?ェテ」ツつ嘉」ツ??」ツ?敕」ツ?ョテ」ツ?セテ」ツ?セテヲツ按サテ」ツ??
    for(int i=0;i<(int)s.size();i++)
      if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
        cnt++;
    if(cnt==(int)s.size()){
      return part(true,s);
    }
  }
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize1(s.substr(1,(int)s.size()-2));
    }
  }
  // not
  if(s[0]=='~'){
    part p=analize1(s.substr(1));
    p.first^=1;
    return p;
  }  
  return part(0,0);
}

cls analize2(const string &s){
  //cout<<s<<endl;
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize2(s.substr(1,(int)s.size()-2));
    }
  }
  // 2テゥツ??ヲツシツ氾ァツョツ療・ツュツ静」ツつ津ヲツ篠「テ」ツ??
  {
    int cnt=0;
    for(int i=0;i<(int)s.size();i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
      else if(cnt==0){
        // split
        if(s[i]=='|'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(false,p3);
          return res;
          //return ppp(p1,p2);
        }
        else if(s[i]=='&'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(true,p3);
          return res;
          //return ppp(p1,p2);
        }
      }
    }
  }
  // not
  if(s[0]=='~'){
    cls p=analize2(s.substr(1));
    p.first^=1;
    p.second.first.first^=1;
    p.second.second.first^=1;
    return p;
  }
}


class TwoSat{
private:
  static const int MAX_V=100000;
  vector<int> G[MAX_V];
  vector<int> rG[MAX_V];
  bool used[MAX_V];
  int cmp[MAX_V];
  vector<int> vs;
  int V;
  void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  void dfs(int s){
    used[s]=true;
    for(int i=0;i<(int)G[s].size();i++){
      int to=G[s][i];
      if(!used[to])dfs(to);
    }
    vs.push_back(s);
  }
  void rdfs(int s,int k){
    used[s]=true;
    cmp[s]=k;
    for(int i=0;i<(int)rG[s].size();i++){
      int to=rG[s][i];
      if(!used[to]){
        rdfs(to,k);
      }
    }
  }
  int makeGraph(int N){
    vs.clear();
    memset(used,0,sizeof(used));
    for(int i=0;i<N;i++)
      if(!used[i])dfs(i);
    memset(used,0,sizeof(used));
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)
      if(!used[vs[i]])rdfs(vs[i],k++);
    return k;
  }
public:
  int Not(int a){
    if(a>=V/2)return a-V/2;
    return a+V/2;
  }
  void init(int V_){
    V=2*V_;
    for(int i=0;i<V;i++)
      G[i].clear(),rG[i].clear();
  }
  void addClosure(int a,int b){
    add_edge(Not(b),a);
    add_edge(Not(a),b);
  }
  bool isSat(){
    makeGraph(V);
    for(int i=0;i<V/2;i++)
      if(cmp[i]==cmp[Not(i)])
        return false;
    return true;
  }
};

TwoSat ts;

int main(){
  
  map<string,int> node;
  int V=1;
  cin>>N>>M;
  for(int i=0;i<N;i++){
    cin>>strs[i];
    strs[i]=strs[i].substr(0,(int)strs[i].size()-1);
  }
  ts.init(M+1);
  ts.addClosure(ts.Not(0),ts.Not(0));
  for(int i=0;i<N;i++){
    // テ」ツ?禿」ツ?ョテヲツ鳴?」ツ?古・ツ、ツ嘉ヲツ閉ーテ」ツつ?,2テ・ツ?凝」ツ?ゥテ」ツ?。テ」ツつ嘉」ツ?凝」ツ?ァテ・ツ?エテ・ツ青暗・ツ按?」ツ??
    bool isAnd=false;
    bool isOr=false;
    string &s=strs[i];
    for(int j=0;j<(int)s.size();j++)
      if(s[j]=='|')isAnd=true;
      else if(s[j]=='&')isOr=true;
    if(isAnd||isOr){
      cls c=analize2(s);
      isAnd=isOr=false;
      if(c.first)isAnd=true;
      else isOr=true;
      if(node.count(c.second.first.second)==0)
        node[c.second.first.second]=V++;
      if(node.count(c.second.second.second)==0)
        node[c.second.second.second]=V++;
      ppp p=c.second;
      int a=node[p.first.second];
      int b=node[p.second.second];
      if(!p.first.first)a=ts.Not(a);
      if(!p.second.first)b=ts.Not(b);
      //cout<<isOr<<" "<<isAnd<<endl;
      if(isOr){
        //cout<<a<<" "<<b<<endl;
        ts.addClosure(a,b);
      }
      else{
        ts.addClosure(0,a);
        ts.addClosure(0,b);
      }
    }
    else{
      
      part p=analize1(s);
      if(node.count(p.second)==0)
        node[p.second]=V++;
      int a=node[p.second];
      if(!p.first){
        a=ts.Not(a);
      }
      ts.addClosure(0,a);
    }
  }
  //cout<<V<<endl;
  if(ts.isSat())cout<<"accept"<<endl;
  else cout<<"reject"<<endl;
  
  return 0;
}
accuracy: 0.10344827586206896
time_ms: 10
memory_kb: 6044
final_rank: 3

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <fstream>

using namespace std;

typedef pair<int,int> pii;
typedef long long ll;
typedef pair<bool,string> part;
typedef pair<part,part> ppp;
typedef pair<bool,ppp> cls;

int N,M;
string strs[501];

part analize1(string s){
  {
    int cnt=0;
    // テ」ツつ「テ」ツδォテ」ツδ陛」ツつ。テ」ツδ凖」ツδε」ツδ暗」ツ??」ツ?妥」ツ?ョテヲツ鳴?・ツュツ療・ツ按療」ツ?ェテ」ツつ嘉」ツ??」ツ?敕」ツ?ョテ」ツ?セテ」ツ?セテヲツ按サテ」ツ??
    for(int i=0;i<(int)s.size();i++)
      if((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z'))
        cnt++;
    if(cnt==(int)s.size()){
      return part(true,s);
    }
  }
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize1(s.substr(1,(int)s.size()-2));
      //return analize1(s);
    }
  }
  // not
  if(s[0]=='~'){
    part p=analize1(s.substr(1));
    p.first^=1;
    return p;
  }  
  return part(0,0);
}

cls analize2(string s){
  //cout<<s<<endl;
  // テヲツ仰ャテ・ツシツァ
  if(s[0]=='('&&s[(int)s.size()-1]==')'){
    int cnt=0;
    for(int i=0;i<(int)s.size()-1;i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
    }
    if(cnt==1){
      return analize2(s.substr(1,(int)s.size()-2));
    }
  }
  // 2テゥツ??ヲツシツ氾ァツョツ療・ツュツ静」ツつ津ヲツ篠「テ」ツ??
  {
    int cnt=0;
    for(int i=0;i<(int)s.size();i++){
      if(s[i]=='(')cnt++;
      else if(s[i]==')')cnt--;
      else if(cnt==0){
        // split
        if(s[i]=='|'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(false,p3);
          return res;
          //return ppp(p1,p2);
        }
        else if(s[i]=='&'){
          part p1=analize1(s.substr(0,i));
          part p2=analize1(s.substr(i+1));
          ppp p3=ppp(p1,p2);
          cls res=make_pair(true,p3);
          return res;
          //return ppp(p1,p2);
        }
      }
    }
  }
  // not
  if(s[0]=='~'){
    cls p=analize2(s.substr(1));
    p.first^=1;
    p.second.first.first^=1;
    p.second.second.first^=1;
    return p;
  }
}


class TwoSat{
private:
  static const int MAX_V=100000;
  vector<int> G[MAX_V];
  vector<int> rG[MAX_V];
  bool used[MAX_V];
  int cmp[MAX_V];
  vector<int> vs;
  int V;
  void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
  }
  void dfs(int s){
    used[s]=true;
    for(int i=0;i<(int)G[s].size();i++){
      int to=G[s][i];
      if(!used[to])dfs(to);
    }
    vs.push_back(s);
  }
  void rdfs(int s,int k){
    used[s]=true;
    cmp[s]=k;
    for(int i=0;i<(int)rG[s].size();i++){
      int to=rG[s][i];
      if(!used[to]){
        rdfs(to,k);
      }
    }
  }
  int makeGraph(int N){
    vs.clear();
    memset(used,0,sizeof(used));
    for(int i=0;i<N;i++)
      if(!used[i])dfs(i);
    memset(used,0,sizeof(used));
    int k=0;
    for(int i=vs.size()-1;i>=0;i--)
      if(!used[vs[i]])rdfs(vs[i],k++);
    return k;
  }
public:
  int Not(int a){
    if(a>=V/2)return a-V/2;
    return a+V/2;
  }
  void init(int V_){
    V=2*V_;
    for(int i=0;i<V;i++)
      G[i].clear(),rG[i].clear();
  }
  void addClosure(int a,int b){
    add_edge(Not(b),a);
    add_edge(Not(a),b);
  }
  bool isSat(){
    makeGraph(V);
    for(int i=0;i<V/2;i++)
      if(cmp[i]==cmp[Not(i)])
        return false;
    return true;
  }
};

TwoSat ts;

int main(){

  // ts.init(2);
  // ts.addClosure(0,1);
  
  // cout<<ts.isSat()<<endl;
  // return 0;
  
  map<string,int> node;
  int V=1;
  cin>>N>>M;
  for(int i=0;i<N;i++){
    cin>>strs[i];
    strs[i]=strs[i].substr(0,(int)strs[i].size()-1);
  }
  ts.init(M+1);
  ts.addClosure(ts.Not(0),ts.Not(0));
  for(int i=0;i<N;i++){
    // テ」ツ?禿」ツ?ョテヲツ鳴?」ツ?古・ツ、ツ嘉ヲツ閉ーテ」ツつ?,2テ・ツ?凝」ツ?ゥテ」ツ?。テ」ツつ嘉」ツ?凝」ツ?ァテ・ツ?エテ・ツ青暗・ツ按?」ツ??
    bool isAnd=false;
    bool isOr=false;
    string &s=strs[i];
    for(int j=0;j<(int)s.size();j++)
      if(s[j]=='|')isAnd=true;
      else if(s[j]=='&')isOr=true;
    if(isAnd||isOr){
      cls c=analize2(s);
      isAnd=isOr=false;
      if(c.first)isAnd=true;
      else isOr=true;
      if(node.count(c.second.first.second)==0)
        node[c.second.first.second]=V++;
      if(node.count(c.second.second.second)==0)
        node[c.second.second.second]=V++;
      ppp p=c.second;
      int a=node[p.first.second];
      int b=node[p.second.second];
      if(!p.first.first)a=ts.Not(a);
      if(!p.second.first)b=ts.Not(b);
      //cout<<isOr<<" "<<isAnd<<endl;
      if(isOr){
        //cout<<a<<" "<<b<<endl;
        ts.addClosure(a,b);
      }
      else{
        ts.addClosure(0,a);
        ts.addClosure(0,b);
      }
    }
    else{
      
      part p=analize1(s);
      if(node.count(p.second)==0)
        node[p.second]=V++;
      int a=node[p.second];
      if(!p.first){
        a=ts.Not(a);
      }
      ts.addClosure(0,a);
    }
  }
  //cout<<V<<endl;
  if(ts.isSat())cout<<"accept"<<endl;
  else cout<<"reject"<<endl;
  
  return 0;
}
accuracy: 0.10344827586206896
time_ms: 20
memory_kb: 6040
final_rank: 8

code_snippet: #define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f
 
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
   
using namespace std;
   
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P> PP;
   
static const double EPS = 1e-8;
   
int tx[] = {0,1,0,-1};
int ty[] = {-1,0,1,0};
 
  // EQUA = FACT | FACT (& FACT)* | FACT (| FACT)*
  // FACT = INVS TERM
  // TERM = (EQUA) | LETTERS
  // INVS = INVS INV | eps
  // LETTER = A | B | ... | Z
 
class Data {
public:
  Data(int p,bool v) : pos(p),val(v){}
  Data() : pos(0),val(true){}
  int pos;
  bool val;
};
 
map<string,bool> table;
 
Data invs(int pos,const string& str);
Data letters(int pos,const string& str);
Data equation(int pos,const string& str);
Data term(int pos,const string& str);
Data factor(int pos,const string& str);
 
  // EQUA = factor (& factor)* | factor (| factor)*
Data equation(int pos,const string& str){
  Data r = factor(pos,str);
  while(str[r.pos+1] == '&' || str[r.pos+1] == '|'){
    Data _r = factor(r.pos+2,str);
 
    if(str[r.pos+1] == '&'){
      r.val = (r.val && _r.val);
    }
    else{
      r.val = (r.val || _r.val);
    }
    r.pos = _r.pos;
  }
  return r;
}
 
Data factor(int pos, const string& str){
  Data inv_r = invs(pos,str);
  //  printf("inv result: %s str:%s pos:%d\n",inv_r.val ? "true" : "false" ,str.c_str(),inv_r.pos);
  Data term_r = term(inv_r.pos+1,str);
   
  if(inv_r.val == true){
    //    printf("factor result: %s str:%s pos:%d\n",term_r.val ? "true" : "false" ,str.substr(pos,term_r.pos-pos+1).c_str(),term_r.pos);
    return term_r;
  }
  else{
    term_r.val = !term_r.val;
    //    printf("factor result: %s str:%s pos:%d\n",term_r.val ? "true" : "false" ,str.substr(pos,term_r.pos-pos+1).c_str(),term_r.pos);
    return term_r;
  }
}
 
Data invs(int pos,const string& str){
  bool val = true;
  int last_pos = pos;
   
  while(str[last_pos] == '~'){
    val = !val;
    last_pos++;
    // printf("last_pos:%d val:%s\n",last_pos,val ? "true" : "false");
  }
 
  Data res(last_pos-1,val);
  return res;
}
 
  // term = (equation) | letters
Data term(int pos,const string& str){
  if(str[pos] == '('){
    Data res = equation(pos+1,str);
    res.pos += 1;
    return res;
  }
  else{
    Data res = letters(pos,str);
    //    printf("last term: %c\n",str[res.pos]);
    return res;
  }
}
 
struct Data letters(int pos,const string& str){
  string key = "";
  int last_pos = pos;
  while(isalpha(str[last_pos])){
    key.push_back(str[last_pos]);
    last_pos++;
  }
 
  bool b;
  if(table.find(key) == table.end()){
    b = true;
  }
  else{
    b = table[key];
  }
  //  printf("%s %s\n",key.c_str(),b ? "true" : "false");
  Data res(last_pos-1,b);
  return res;
}
 
void UpdateTable(map<string,bool>& table){
  // cout << table.size() << endl;
  for(map<string,bool>::iterator it = table.begin();
      it != table.end();
      it++){
 
    bool flag = rand() % 2;
    it->second = flag;
  }
}
 
void PrintTable(map<string,bool>& table){
  //  cout << table.size() << endl;
  for(map<string,bool>::iterator it = table.begin();
      it != table.end();
      it++){
    printf("%s %s ",(it->first).c_str(),it->second ? "true" : "false"); 
  }
  printf("\n");
}
 
int main(){
 
  int command_num,val_num;
  while(~scanf("%d %d",&command_num,&val_num)){
 
    vector<string> commands;
    for(int i=0;i<command_num;i++){
      string str;
      cin >> str;
      commands.push_back(str);
    }
 
    map<int,vector<string> > vals;
    for(int i=0;i<commands.size();i++){
      //      cout << commands[i] << endl;
      string str = "";
      for(int j=0;j<commands[i].size();j++){
    if(isalpha(commands[i][j])){
      str.push_back(commands[i][j]);
    }
    else{
      if(str.size() >= 1){
        //      cout << str << endl;
        vals[i].push_back(str);
        table[str] = true;
      }
      str = "";
    }
      }
    }
 
    const int UPPER_ROUND = 20;
    bool satisfied = false;
 
    for(int round=1;round < UPPER_ROUND; round++){
 
      UpdateTable(table);
 
      for(int walk_num=1,size = table.size();walk_num <= 2 * size;walk_num++){
    bool isok = true;
    int clause_idx;
    for(int i=0;i<commands.size();i++){
      Data d = equation(0,commands[i]);
      if(d.val == false) {
        clause_idx = i;
        isok = false;
        break;
      }
    }
 
    if(isok){
      satisfied = true;
      goto found;
    }
 
    int inv_val_idx = rand() % vals[clause_idx].size();
    string key = vals[clause_idx][inv_val_idx];
    table[key] = !table[key];
      }
    }
  found:;
    printf("%s\n",satisfied ? "accept" : "reject");
  }
}
accuracy: 1
time_ms: 380
memory_kb: 1400
final_rank: 1

code_snippet: #define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
  
using namespace std;
  
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P> PP;
  
static const double EPS = 1e-8;
  
int tx[] = {0,1,0,-1};
int ty[] = {-1,0,1,0};

  // EQUA = FACT | FACT (& FACT)* | FACT (| FACT)*
  // FACT = INVS TERM
  // TERM = (EQUA) | LETTERS
  // INVS = INVS INV | eps
  // LETTER = A | B | ... | Z

class Data {
public:
  Data(int p,bool v) : pos(p),val(v){}
  Data() : pos(0),val(true){}
  int pos;
  bool val;
};

map<string,bool> table;

Data invs(int pos,const string& str);
Data letters(int pos,const string& str);
Data equation(int pos,const string& str);
Data term(int pos,const string& str);
Data factor(int pos,const string& str);

  // EQUA = factor (& factor)* | factor (| factor)*
Data equation(int pos,const string& str){
  Data r = factor(pos,str);
  while(str[r.pos+1] == '&' || str[r.pos+1] == '|'){
    Data _r = factor(r.pos+2,str);

    if(str[r.pos+1] == '&'){
      r.val = (r.val && _r.val);
    }
    else{
      r.val = (r.val || _r.val);
    }
    r.pos = _r.pos;
  }
  return r;
}

Data factor(int pos, const string& str){
  Data inv_r = invs(pos,str);
  //  printf("inv result: %s str:%s pos:%d\n",inv_r.val ? "true" : "false" ,str.c_str(),inv_r.pos);
  Data term_r = term(inv_r.pos+1,str);
  
  if(inv_r.val == true){
    //    printf("factor result: %s str:%s pos:%d\n",term_r.val ? "true" : "false" ,str.substr(pos,term_r.pos-pos+1).c_str(),term_r.pos);
    return term_r;
  }
  else{
    term_r.val = !term_r.val;
    //    printf("factor result: %s str:%s pos:%d\n",term_r.val ? "true" : "false" ,str.substr(pos,term_r.pos-pos+1).c_str(),term_r.pos);
    return term_r;
  }
}

Data invs(int pos,const string& str){
  bool val = true;
  int last_pos = pos;
  
  while(str[last_pos] == '~'){
    val = !val;
    last_pos++;
    // printf("last_pos:%d val:%s\n",last_pos,val ? "true" : "false");
  }

  Data res(last_pos-1,val);
  return res;
}

  // term = (equation) | letters
Data term(int pos,const string& str){
  if(str[pos] == '('){
    Data res = equation(pos+1,str);
    res.pos += 1;
    return res;
  }
  else{
    Data res = letters(pos,str);
    //    printf("last term: %c\n",str[res.pos]);
    return res;
  }
}

struct Data letters(int pos,const string& str){
  string key = "";
  int last_pos = pos;
  while(isalpha(str[last_pos])){
    key.push_back(str[last_pos]);
    last_pos++;
  }

  bool b;
  if(table.find(key) == table.end()){
    b = true;
  }
  else{
    b = table[key];
  }
  //  printf("%s %s\n",key.c_str(),b ? "true" : "false");
  Data res(last_pos-1,b);
  return res;
}

void UpdateTable(map<string,bool>& table){
  // cout << table.size() << endl;
  for(map<string,bool>::iterator it = table.begin();
      it != table.end();
      it++){

    bool flag = rand() % 2;
    it->second = flag;
  }
}

void PrintTable(map<string,bool>& table){
  //  cout << table.size() << endl;
  for(map<string,bool>::iterator it = table.begin();
      it != table.end();
      it++){
    printf("%s %s ",(it->first).c_str(),it->second ? "true" : "false"); 
  }
  printf("\n");
}

int main(){

  int command_num,val_num;
  while(~scanf("%d %d",&command_num,&val_num)){

    vector<string> commands;
    for(int i=0;i<command_num;i++){
      string str;
      cin >> str;
      commands.push_back(str);
    }

    map<int,vector<string> > vals;
    for(int i=0;i<commands.size();i++){
      //      cout << commands[i] << endl;
      string str = "";
      for(int j=0;j<commands[i].size();j++){
	if(isalpha(commands[i][j])){
	  str.push_back(commands[i][j]);
	}
	else{
	  if(str.size() >= 1){
	    //	    cout << str << endl;
	    vals[i].push_back(str);
	    table[str] = true;
	  }
	  str = "";
	}
      }
    }

    const int UPPER_ROUND = 20;
    bool satisfied = false;

    for(int round=1;round < UPPER_ROUND; round++){

      UpdateTable(table);

      for(int walk_num=1,size = table.size();walk_num <= 2 * size;walk_num++){
	bool isok = true;
	int clause_idx;
	for(int i=0;i<commands.size();i++){
	  Data d = equation(0,commands[i]);
	  if(d.val == false) {
	    clause_idx = i;
	    isok = false;
	    break;
	  }
	}

	if(isok){
	  satisfied = true;
	  goto found;
	}

	int inv_val_idx = rand() % vals[clause_idx].size();
	string key = vals[clause_idx][inv_val_idx];
	table[key] = !table[key];
      }
    }
  found:;
    printf("%s\n",satisfied ? "accept" : "reject");
  }
}
accuracy: 1
time_ms: 380
memory_kb: 1400
final_rank: 1