列表

详情


NC54602. 禁止复读

描述

牛牛是苏州大学icpc群的管理,他最讨厌的就是复读机,因此他决定将所有发起复读的人(即连续第二个说同一句话的人,若是一个人连续发同一句话发了两遍则该人也是发起复读的人)都禁言,牛牛今天白天没有时间看群,晚上他看到了今天全部的聊天记录,但是数据实在是太多了,你能帮他看一看需要禁言哪些人吗?

输入描述

第一行输入为n和m,,n表示群里的人数(有些人可能没说过话),m表示聊天记录条数,聊天记录的时间顺序就是输入顺序
第2行到第m+1行为聊天记录,每行为一个数字p和一个字符串s,p表示发言的人的编号,s表示这个人说的话
,保证s只由小写字母组成

输出描述

第一行输出一个数k, 表示被禁言的人数

第二行从小到大用空格隔开输出k个数,表示被禁言的人的编号(如果k=0则输出空行)

示例1

输入:

5 5
1 soochow
2 soochow
3 soochow
4 university
4 university

输出:

2
2 4

说明:

2复读了1说的话发起了'soochow'的复读,3并没有发起复读,4一个人发起了'university'的复读,因此2和4将被禁言

示例2

输入:

4 8
1 welcome
2 to
1 the
3 welcome
4 soochow
1 soochow
4 university
1 university

输出:

1
1

说明:

只有1会被禁言

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 420K, 提交时间: 2023-06-04 14:14:32

#include<bits/stdc++.h>
using namespace std;
int p[102];
int main()
{
	string a,b="-1",c="-1";
	int k,n,m,w=0;
	cin>>n>>m;
	for(int i=0;i<m;i++)
	{
		cin>>k>>a;
		if(a==b)
		{
			if(a!=c)
			{
				if(p[k]==0)
			    w++;
			    p[k]++;
			    c=a;
			}
			
		}
		else c="-1";
		b=a;
	}
	cout<<w<<endl;
	if(w==0) cout<<" ";
	else for(int i=1;i<=n;i++)
	{
		if(p[i]!=0) cout<<i<<" ";
	}
}

Python3 解法, 执行用时: 48ms, 内存消耗: 4840K, 提交时间: 2022-08-29 19:01:47

n, m = map(int, input().split())
a = [(0, "")]
for _ in range(m):
    a.append(input().split())
s = set()
for i in range(2, m+1):
    if a[i][1] == a[i-1][1] and a[i-1][1] != a[i-2][1]:
        s.add(int(a[i][0]))
print(len(s))
print(" ".join(map(str, sorted(s))))

上一题