CF56C Corporation Mail 题解
首先:这道题的题面上画了一颗树,但好像并不是关于树的题目啊...
1.变量
1. 定义一个char形变量 \(c\) ,一个个读入那些字符,直到EOF❶.
2. 定义一个存储名字用的字符串数组 \(names\)
3. 定义一个记录人数用的int形变量 \(people\)
2.思路
1. 在遇到\(.\)字符时,计算其之前与其同名的人的个数,然后 ans++
2. 在遇到\(,\)或\(:\)时,增加人数,即people++
3. 如果输入的是人名的一部分,那么继续"堆叠"这个名字,可以有 names[people]+=c
3.可能会犯的一些问题
1. 用 while 输入时,必须特判EOF,不然样例一会TLE,样例三会RE
2. 判断完这个 people 以后,必须将其删去,不然会重复判断
代码
#include<bits/stdc++.h>
using namespace std;
int ans,people=1;
char c;
string names[1000005];
int main() {
while(scanf("%c",&c)!=EOF) {
if(c=='.') {
for(int i=0;i<people;i++)
if(names[people]==names[i])
ans++;
names[people--]="";
}
else if(c==':'||c==',') people++;
else names[people]=names[people]+c;
}
printf("%d",ans);
return 0;
}
一些备注:
因为样例可读性问题,我在这道水题上卡了很久,所以这里奉上样例解释:
样例1: 如图。

样例2:
\(A\) 有一个下属叫 \(A_{1}\)
触发1次 \(不舒服情况\)
样例3:
\(A\) 有一个下属叫 \(C_{1}\)
\(C_{1}\) 有一个下属叫 \(C_{2}\)
\(C_{2}\) 有一个下属叫 \(C_{3}\)
\(C_{3}\) 有一个下属叫 \(C_{4}\)
\(C_{1}\) 与 \(C_{2}\) 触发1次 \(不舒服情况\)
\(C_{1}\) 与 \(C_{3}\) 触发1次 \(不舒服情况\)
\(C_{1}\) 与 \(C_{4}\) 触发1次 \(不舒服情况\)
\(C_{2}\) 与 \(C_{3}\) 触发1次 \(不舒服情况\)
\(C_{2}\) 与 \(C_{4}\) 触发1次 \(不舒服情况\)
\(C_{3}\) 与 \(C_{4}\) 触发1次 \(不舒服情况\)
总共触发6次 \(不舒服情况\)
❶ : 什么,你不知道EOF? 研究一下这个,也许对你有帮助.

浙公网安备 33010602011771号