题目描述:
告警抑制,是指高优先级告警抑制低优先级告警的规则。高优先级告警产生后,低优先级告警不再产生。请根据原始告警列表和告警抑制关系,给出实际产生的告警列表。不会出现循环抑制的情况。告警不会传递,比如A->B.B->C,这种情况下A不会直接抑制C。但被抑制的告警仍然可以抑制其他低优先级告警。
输入描述:
第一行为数字N,表示告警抑制关系个数,0<=N <=120?
接下来N行,每行是由空格分隔的两个告警ID,例如: id1 id2,表示id1抑制id2,告警ID的格式为:?
大写字母+0个或者1个数字 最后一行为告警产生列表,列表长度[1,100]
输出描述:
真实产生的告警列表
备注:
告警ID之间以单个空格分隔
示例1:?
输入:
2
A B
B C
A B C D E
输出:
A D E?
说明:
A抑制了B,B抑制了C,最后实际的告警为A D E
示例2:
输入:
4
F G
C B
A G
A O A
A B C D E
输出:
A C D E ?
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
根据题目描述,我们需要构造出告谨之间的抑制关系,就可以直接遍历每一个id2,获得实际的告警列表信息。
# -*- coding: utf-8 -*-
'''
@File : 2023-B-告警抑制.py
@Time : 2023/12/28 02:02:06
@Author : mgc
@Version : 1.0
@Desc : None
'''
# import os
# import re
# import sys
# import copy
# import math
# import queue
# import functools
# from queue import Queue
# from collections import Counter, defaultdict
def generateActualAlerts():
count = int(input()) # 告警抑制关系个数
alter_relations = {} # 告警之间的关系字典
# 处理告警抑制关系
for i in range(count):
arr = input().split() # 输入告警抑制关系
if arr[1] not in alter_relations:
alter_relations[arr[1]] = []
alter_relations[arr[1]].append(arr[0])
all_alerts = input().split() # 告警产生列表
alter_set = set(all_alerts)
result = ""
for id2 in all_alerts:
if id2 not in alter_relations or alter_set.isdisjoint(alter_relations.get(id2)):
result += id2 + " "
return result[:-1] # 去除最后一个空格
# 调用主函数
if __name__ == '__main__':
actual_alerts = generateActualAlerts()
print(actual_alerts)