寻找复读机

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzyws739307453/article/details/82944614

链接:https://www.nowcoder.com/acm/contest/204/J
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld

题目描述

某个 QQ 群里一共有 n 个人,他们的编号是 1..n,其中有一些人本质上是复读机。
小 A 发现,如果一个人的本质是复读机,那么他每次发的消息一定跟群里的上一条消息一样,特别地第一个发消息的人一定不是复读机。
现在小 A 搞到了一份聊天记录,他想请你找出所有可能是复读机的群友

输入描述

第一行两个正整数 n,m,表示群里的人数和聊天记录的总条数
接下来 m 行按时间顺序给出聊天记录,每行有一个正整数 x 和一个小写字母字符串 S,表示群友 x 发了消息 S

输出描述

输出一行,将所有可能是复读机的群友的编号按照从小到大排序后输出,每两个编号之间隔一个空格

输入

3 5
1 gugugu
2 gugugu
1 gugu
3 tingzhifudu
2 tingzhifudu

输出

2

备注

1≤ n≤ 10^3
1≤ m≤ 10^3
1≤ |S|≤ 100

解题思路

因为,如果是复读机,那么他每次发的消息一定跟群里的上一条消息一样,反之,如果他每次发的消息跟群里的上一条消息不一样,那么他就不是复读机。故首先可令群里的人全为复读机,然后判断一下是否发了新消息,如果发了新消息,则标记。最后未标记的即为复读机(第一位发言的不是复读机)。

#include <stdio.h>
#include <string.h>
int main()
{
	char str[1010][110];
	int ans[1010], a, x, n, m, j, temp;
	while (~scanf("%d%d", &n, &m))
	{
		temp = 0;
		memset(ans, 0, sizeof(ans));
		scanf("%d%s", &a, str[0]);
		for (int i = 1; i < m; i++)
		{
			scanf("%d%s", &x, str[i]);
			if (strcmp(str[i], str[i - 1]))
				ans[x] = 1;
		}
		ans[a] = 1;
		for (int i = 1; i <= n; i++)
		{
			if (!ans[i])
			{
				if (temp)
					printf(" ");
				else temp = 1;
				printf("%d", i);
			}
		}
		printf("\n");
	}
	return 0;
}
扫描二维码关注公众号,回复: 3446330 查看本文章

猜你喜欢

转载自blog.csdn.net/lzyws739307453/article/details/82944614