vector卡到绝望。。。。。。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 1e5 + 10;
int mem, head[maxn];
struct Edge {
int to, id, next;
}edges[maxn<<1];
vector<pair<int, int> > e;
int C, color[maxn];
int ans;
void init() {
mem = 0;
memset(head, -1, sizeof(head));
e.clear();
C = 0;
memset(color, 0, sizeof(color));
ans = 0;
}
void addedge(int from, int to) {
++mem;
edges[mem].to = to, edges[mem].id = 0, edges[mem].next = head[from]; head[from] = mem;
++mem;
edges[mem].to = from, edges[mem].id = 1, edges[mem].next = head[to]; head[to] = mem;
}
void dfs(int u) {
color[u] = C;
for (int i = head[u]; ~i; i = edges[i].next) {
int v = edges[i].to;
if (color[v]) continue;
dfs(v);
}
}
void dfs_(int u) {
ans++;
for (int i = head[u]; ~i; i = edges[i].next) {
int v = edges[i].to, id = edges[i].id;
if (id) dfs_(v);
}
}
void solve() {
init();
int n;
scanf("%d", &n);
int x;
char s[20];
for (int i = 1; i <= n; i++) {
scanf("%d%s", &x, s);
if (s[0] == 'v') addedge(i, x);
else e.push_back(make_pair(i, x));
}
for (int i = 1; i <= n; i++) {
if (color[i]) continue;
++C;
dfs(i);
}
for (int i = 0; i < e.size(); i++) {
int u = e[i].first, v = e[i].second;
if (color[u] != color[v]) continue;
dfs_(v);
}
printf("0 %d\n", ans);
}
int main() {
int T;
scanf("%d", &T);
while (T--) solve();
return 0;
}