DFS板子
1. 用map:id将string转为int好套板子
2.DFS出口:用map: odr_num来记录叶节点下的老人个数,避免判断叶节点是不是数字
3.odrpa记录老人的上家,方便动态转移老人
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000010
int N, M, cnt = 0;
char c;
string a, b;
unordered_map<string,int> id;
unordered_map<int,int> odr_num;
unordered_map<int,int> odrpa;
vector<int> cd[MAXN];
int getsum( int pos ){
int sum = odr_num[pos];
for( auto &child : cd[pos] ) sum += getsum(child);
return sum;
}
int main(){
cin >> N >> M ;
while( M -- ){
cin >> a >> b;
if( !id[a] ) id[a] = ++cnt; if( !id[b] ) id[b] = ++cnt;
if( a[0] >= '0' && a[0] <= '9') odr_num[odrpa[id[a]] = id[b]] ++ ;
else cd[id[b]].push_back(id[a]);
}
while( cin >> c && c != 'E' ){
if( c == 'Q' ){
cin >> a;
cout << getsum(id[a]) << endl;
}else{
cin >> a >> b;
if( !id[a] ) id[a] = ++cnt; if( !id[b] ) id[b] = ++cnt;
if( odrpa[id[a]] ) odr_num[odrpa[id[a]]] --;
odr_num[id[b]] ++;
}
}
}