#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
#define N 902
int n, m;
vector<int> map[N];
int E[N<<1], D[N<<1], R[N], flag[N], Min[N<<1][12], cnt, rt;
void dfs( int x, int h ){
E[++cnt]= x; D[cnt]= h;
if( !flag[x] ){ R[x]= cnt; flag[x]= 1; }
for( size_t i= 0; i< map[x].size(); ++i ){
int v= map[x][i];
if( flag[v]== 0 ) dfs( v, h+ 1 );
E[++cnt]= x; D[cnt]= h;
}
}
void init(){
for( int i= 1; i<= cnt; ++i ) Min[i][0]= i;
for( int i= 1; 1<<i< cnt; i++ )
for( int j= 0, s= 1<< (i-1); j+ s< cnt; j++ ){
if( D[ Min[j][i-1] ]< D[ Min[j+ s][i-1] ] )Min[j][i]= Min[j][i-1];
else Min[j][i]= Min[j+s][i-1];
}
}
int rmq( int x, int y ){
if( x> y ) x^= y^= x^= y;
int d= y- x+ 1, t= 0;
while( 1<<t <= d ) t++; t--;
if( D[ Min[x][t] ]< D[ Min[y-(1<<t)+1][t] ] ) return Min[x][t];
else return Min[y-(1<<t)+1][t];
}
int main(){
while( scanf("%d",&n)!= EOF ){
for( int i= 0; i<= n; ++i ) flag[i]= 0;
cnt= 0;
for( int i= 1; i<= n; ++i ){
int u, num, v;
scanf("%d",&u);
while( getchar()!= '(');
scanf("%d",&num);
while( getchar()!= ')');
while( num-- ){
scanf("%d",&v );
map[u].push_back(v); flag[v]++;
}
}
for( int i= 1; i<= n; ++i )
if( flag[i]== 0 ){ rt= i; break; }
for( int i= 0; i<= n; ++i ) flag[i]= 0;
dfs( rt, 0 );
init();
for( int i= 0; i<= n; ++i ) flag[i]= 0;
scanf("%d",&m );
for( int i= 1; i<= m; ++i ){
while( getchar()!= '(' );
int u, v;
scanf("%d%d", &u, &v );
int pos= rmq( R[u], R[v] );
flag[ E[pos] ]++;
while( getchar()!= ')' );
}
for( int i= 1; i<= n; ++i )
if( flag[i] ) printf("%d:%d\n", i, flag[i] );
for( int i= 0; i<= n; ++i ) map[i].clear();
}
return 0;
}
|