Codeforces 56 C. Corporation Mail

問題

ある会社の組織図が与えられる。
「自分の(直接または間接の)部下と同じ名前を持つ人」は何人いるか、答えよ。

組織図の与えられ方は以下の通り。
employee ::= name. | name:employee1,employee2, ... ,employeek.
name ::= 従業員の名前(文字列)

制約条件

与えられる文字列の長さ≦1000

方針

再帰を使って、一文字先読みの構文解析をすればよい。
構文解析をした後は、またナイーブに再帰で、部下に自分と同じ名前の人が何人いるか数えればよい。

ソースコード

string in;
int l;
int p;
struct S{
  vector<S> s;
  string name;
};
S emp(){
  S res;
  int t=p;
  while(in[p]!=':'&&in[p]!='.'&&in[p]!=',')p++;
  res.name=in.substr(t,p-t);
  while(in[p++]!='.'){
    S tmp=emp();
    res.s.pb(tmp);
  }
  return res;
}
int ans;
void dfs2(const S &s,string name){
  if(s.name==name)ans++;
  rep(i,s.s.size())dfs2(s.s[i],name);
}
void dfs(const S &s){
  rep(i,s.s.size()){
    dfs2(s.s[i],s.name);
    dfs(s.s[i]);
  }
}
void run(){
  cin>>in;
  l=in.size();
  p=0;
  S a=emp();
  ans=0;
  dfs(a);
  cout<<ans<<endl;
}