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; }