NC54602. 禁止复读
描述
输入描述
第一行输入为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))))