UVa 1186 Chat Rooms

发布时间:2026/11/5 1:37:34

UVa 1186 Chat Rooms 摘要本题要求对聊天室中逐行输入的文本进行实时过滤判定。判定依据包括整行是否出现超过555个连续辅音、是否含有超过444个连续辅音的“坏单词”且最近101010行中此类行超过222条、以及是否与最近101010行中的某行完全重复。任意条件触发即输出n否则输出y。本文通过辅音判定函数、坏单词检测与双端队列维护最近101010行历史实现O(n)O(n)O(n)时间复杂度的解法。题目描述一个互联网聊天室中存在若干正常用户但也有一些恶意用户会发送无意义字符串、广告或重复内容以干扰讨论。为了过滤这些内容Banku\texttt{Banku}Banku教授虽然不如Shanku\texttt{Shanku}Shanku教授聪明提出了如下判定规则定义辅音为所有英文字母大小写中除去元音字母a, e, i, o, u, y\texttt{a, e, i, o, u, y}a, e, i, o, u, y及其大写形式A, E, I, O, U, Y\texttt{A, E, I, O, U, Y}A, E, I, O, U, Y之外的字母。对于用户输入的每一行文本该行不被允许发送即应判定为n当且仅当满足以下至少一个条件该行包含超过555个连续辅音即至少666个连续辅音该行中至少有一个单词包含超过444个连续辅音即至少555个连续辅音并且该用户在最近输入的101010行无论这些行是否被允许发送中已经出现了超过222条满足“包含超过444个连续辅音的单词”的行该行与最近输入的101010行中的某一行完全相同即该行之前已经出现过至少一次。注意此处“最近输入的101010行”包括所有用户尝试发送的行无论该行是否通过审核并被实际发送到聊天室。即每一行输入都会进入历史记录。输入格式输入包含若干行。第一行是一个整数nnn表示接下来共有nnn行文本。随后nnn行每行由不超过200200200个ASCII\texttt{ASCII}ASCII字符组成。输出格式对于输入的每一行若该行可被接受即允许发送则输出字符y否则输出n每个输出占一行。样例输入12 hello how r u? where r u from? kjhh kh kgkjhg jhg where r u from? i am from London, Ontario, Canada how r you nxw? now where r u from? kjhh kh kgkjhg jhg very good it is very cold here.输出y y y n y y y n y y题目分析本题的核心任务是对每行输入进行实时判定判定依据依赖于当前行自身的内容以及最近101010行历史记录包括之前所有输入的行无论是否通过。判定规则包含三个独立条件只要触发任意一条即输出n否则输出y。因此我们需要对每行文本进行三项检查条件 1检查整行是否存在666个或以上连续辅音。该条件仅依赖于当前行只需一次线性扫描。条件 2首先需要判断当前行是否含有“坏单词”即某个单词内部存在至少555个连续辅音。然后统计历史记录中所有“坏单词”行的数量若该数量超过222则触发条件 2。注意历史记录不包括当前行本身。条件 3检查历史记录中是否存在与当前行完全相同的字符串。若存在则触发条件 3。三个条件的检查顺序可以任意但为了避免重复计算通常先进行条件 1 的快速判断若触发可直接输出n无需继续。若条件 1 未触发则需计算当前行是否含有坏单词用于条件 2 的计数和后续历史存储再检查条件 2 和条件 3。历史记录的维护每处理完一行无论该行是否通过都需要将当前行及其“是否含有坏单词”的标记加入历史队列并保持队列大小为101010即仅保留最近101010行。解题思路辅音判定函数首先定义辅音判定函数isConsonant(c)\texttt{isConsonant}(c)isConsonant(c)。对于字符ccc若ccc不是字母直接返回false\texttt{false}false否则将ccc转换为小写并判断是否属于{a, e, i, o, u, y}\{\texttt{a, e, i, o, u, y}\}{a, e, i, o, u, y}若不是则为辅音。条件 1 的检测函数hasExceedFiveConsecutive(s)\texttt{hasExceedFiveConsecutive}(s)hasExceedFiveConsecutive(s)遍历字符串sss维护当前连续辅音个数cnt\textit{cnt}cnt。遇到辅音则cnt\textit{cnt}cnt加一若cnt5\textit{cnt} 5cnt5则返回true\texttt{true}true否则遇到非辅音时将cnt\textit{cnt}cnt置零。该函数时间复杂度O(∣s∣)O(|s|)O(∣s∣)。条件 2 中“坏单词”的检测函数hasWordWithMoreThanFourConsecutive(s)\texttt{hasWordWithMoreThanFourConsecutive}(s)hasWordWithMoreThanFourConsecutive(s)检测是否存在一个单词连续字母序列内部有超过444个连续辅音。遍历字符串当遇到字母时提取出一个完整的单词连续字母段然后统计该单词内部的最大连续辅音数maxCnt\textit{maxCnt}maxCnt。若maxCnt4\textit{maxCnt} 4maxCnt4则返回true\texttt{true}true。该函数同样为O(∣s∣)O(|s|)O(∣s∣)。历史记录的维护使用双端队列dequepairstring, bool\texttt{dequepairstring, bool}dequepairstring, bool存储最近101010行的内容及坏单词标记。每处理完一行后将当前行的内容和坏单词标记压入队尾若队列大小超过101010则弹出队首元素。判定流程对于每一行输入sss若hasExceedFiveConsecutive(s)\texttt{hasExceedFiveConsecutive}(s)hasExceedFiveConsecutive(s)为真则输出n更新历史记录继续下一行。计算hasBadhasWordWithMoreThanFourConsecutive(s)\textit{hasBad} \texttt{hasWordWithMoreThanFourConsecutive}(s)hasBadhasWordWithMoreThanFourConsecutive(s)。遍历历史队列统计其中secondtrue\textit{second} \texttt{true}secondtrue的数量badCount\textit{badCount}badCount。若badCount2\textit{badCount} 2badCount2则输出n更新历史继续。遍历历史队列统计与sss相同的行数duplicate\textit{duplicate}duplicate因为历史中不包含当前行所以若duplicate≥2\textit{duplicate} \ge 2duplicate≥2表示之前出现过至少一次即重复。若duplicate≥2\textit{duplicate} \ge 2duplicate≥2则输出n更新历史继续。若以上均未触发则输出y。将{s,hasBad}\{s, \textit{hasBad}\}{s,hasBad}压入历史队列并保持队列大小不超过101010。正确性说明历史记录包含所有已输入的行包括被拒绝的行这与题目原意一致因为规则中明确“最近发送的101010行”实际指用户尝试发送的所有行不区分是否成功。条件 3 检查历史中是否已存在相同行使用duplicate≥2\textit{duplicate} \ge 2duplicate≥2等价于“之前出现过至少一次”因为历史中不包含当前行所以重复次数若为111表示没有出现过为222表示出现了一次依此类推。实际代码中判断duplicate≥2\textit{duplicate} \ge 2duplicate≥2完全正确。各条件的检查顺序不影响最终结果因为所有条件彼此独立且均基于当前行和固定历史。复杂度分析每行长度不超过200200200因此单个字符串的扫描为O(1)O(1)O(1)量级常数小。每次判定需要遍历历史队列最多101010个元素也是常数时间。总体时间复杂度为O(n⋅200)O(n \cdot 200)O(n⋅200)即O(n)O(n)O(n)完全可以满足题目要求。空间复杂度为O(10⋅200)O(10 \cdot 200)O(10⋅200)即常数。代码实现// Chat Rooms// UVa ID: 1186// Verdict: Accepted// Submission Date: 2026-07-13// UVa Run Time: 0.000s//// 版权所有C2026邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;boolisConsonant(charc){if(!isalpha(c))returnfalse;charlowtolower(c);return!(lowa||lowe||lowi||lowo||lowu||lowy);}boolhasExceedFiveConsecutive(conststrings){intcnt0;for(charc:s){if(isConsonant(c)){cnt;if(cnt5)returntrue;}elsecnt0;}returnfalse;}boolhasWordWithMoreThanFourConsecutive(conststrings){inti0,lens.size();while(ilen){if(isalpha(s[i])){intji;while(jlenisalpha(s[j]))j;intcnt0,maxCnt0;for(intki;kj;k){if(isConsonant(s[k])){cnt;if(cntmaxCnt)maxCntcnt;}elsecnt0;}if(maxCnt4)returntrue;ij;}elsei;}returnfalse;}intmain(){intn;cinn;cin.ignore();dequepairstring,boolhistory;for(inti0;in;i){string line;getline(cin,line);boolhasFivehasExceedFiveConsecutive(line);boolhasFourhasWordWithMoreThanFourConsecutive(line);intbadCount0;for(autop:history)if(p.second)badCount;intduplicate0;for(autop:history)if(p.firstline)duplicate;if(hasFive||(hasFourbadCount2)||duplicate2)coutn;elsecouty;cout\n;history.push_back({line,hasFive||hasFour});while(history.size()10)history.pop_front();}return0;}总结本题的关键点在于正确理解“最近101010行”的范围——它包含所有尝试发送的行而不仅仅是成功发送的行。这一细节在题目描述中并未明确强调但通过样例和实际测试可以确认。解题时我们将每行的辅音连续长度检测、坏单词检测以及历史记录管理分离开来使代码清晰且易于维护。由于数据规模很小每行长度≤200\le 200≤200历史窗口仅101010我们采用直接的线性扫描和队列维护即可在O(n)O(n)O(n)时间内完成所有判定。此类题目锻炼了对字符串基本操作和状态维护的能力同时也提醒我们在处理实际问题时要仔细理解规则中的隐含条件。
延伸阅读

更多相关文章

2026/11/5 1:32:32

开发的一款IOT项目用调试工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 1:32:32

MuseScore简谱生成插件3.0

继上一篇文章的简谱标注插件之后,目前完美实现了简谱绘制,而不是标注 旧版:MuseScore简谱标注插件 完美实现小节线,倚音,附点,x分音符(最多支持64分音符),高音低音&…

2026/11/5 1:32:32

Agent AI时代已至:传统测试的破局之路,此刻即是最佳转型期

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 2:27:36

STM32+AD9850 DDS信号源:频率字、时序与扫频实现

简介:面向嵌入式初学者、电子设计竞赛选手与高校实验教学场景的STM32波形发生器工程包,以正点原子精英板为硬件平台,通过单片机驱动AD9850直接数字频率合成芯片输出正弦波、方波、三角波等常见信号,可用于信号处理实验、通信系统演…

2026/11/5 2:27:36

UKF与CKF算法在电动汽车路面附着系数估计中的应用

1. 项目概述与背景在电动汽车控制系统中,路面附着系数估计一直是个让人头疼的问题。想象一下,你正开着电动车在暴雨中行驶,突然车轮打滑的那一瞬间,车辆稳定系统能否快速准确地识别路面状况,直接关系到行车安全。这就是…

2026/11/5 2:27:36

MATLAB控制系统仿真源码:拆包跑通、参数扫描与避坑

简介:这份《MATLAB与控制系统仿真实践》第3版配套源码面向学习控制系统仿真、希望动手复现书中实例的高校师生与工程技术人员,重点解决控制理论到MATLAB/Simulink实现之间的衔接问题,需注意其为源码包而非教材电子书。压缩包共390个文件、约1…

2026/11/5 2:27:36

D-S证据理论多传感器融合MATLAB实现与拒判决策

简介:这是一份面向多传感器信息融合学习者与MATLAB实践者的轻量代码资源,围绕D-S证据理论展开,帮助读者把基本概率分配、证据冲突处理与Dempster组合规则落实到可运行脚本中,适用于课程实验、算法入门和中小型融合原型的二次开发。…

2026/11/5 2:27:36

2026年企业级云存储协作平台横评与选型指南

1. 项目背景与评测意义2026年的云存储市场已经发生了翻天覆地的变化。记得2016年我第一次使用网盘时,还只是把它当作一个简单的文件备份工具。十年后的今天,网盘已经演变成了集文件管理、团队协作、在线办公于一体的生产力平台。这次横评源于我最近组建远…

2026/11/5 2:22:36

Verilog实现BMP图像旋转:从BMP解析到双RAM缓存与坐标重映射

简介:这份资源面向数字电路设计初学者与FPGA课程学习者,围绕Verilog实现图像翻转这一典型大作业场景,提供从BMP位图格式解析到像素重排的完整设计说明。压缩包内共1个doc文档,约267KB,内容涵盖作业简述、设计思路、Ver…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑