CF56C Corporation Mail 题解

前言

这道题的题面上画了一颗树,但好像并不是关于树的题目啊...

1.变量

1. 定义一个char形变量 cc ,一个个读入那些字符,直到EOF❶.

2. 定义一个存储名字用的字符串数组 namesnames

3. 定义一个记录人数用的int形变量 peoplepeople

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;
}
//code by TheCedar

一些备注:

因为样例可读性问题,我在这道水题上卡了很久,所以这里奉上样例解释:

样例1: 如图。

RT

样例2:

AA 有一个下属叫 A1A_{1}

触发1次 不舒服情况

样例3:

AA 有一个下属叫 C1C_{1}

C1C_{1} 有一个下属叫 C2C_{2}

C2C_{2} 有一个下属叫 C3C_{3}

C3C_{3} 有一个下属叫 C4C_{4}

C1C_{1}C2C_{2} 触发1次 不舒服情况

C1C_{1}C3C_{3} 触发1次 不舒服情况

C1C_{1}C4C_{4} 触发1次 不舒服情况

C2C_{2}C3C_{3} 触发1次 不舒服情况

C2C_{2}C4C_{4} 触发1次 不舒服情况

C3C_{3}C4C_{4} 触发1次 不舒服情况

总共触发6次 不舒服情况

❶ : 什么,你不知道EOF? 研究一下这个,也许对你有帮助.