7-5 别再来这么多猫娘了!分数 15 全屏浏览 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 以 GPT 技术为核心的人工智能系统出现后迅速引领了行业的变革,不仅用于大量的语言工作(如邮件编写或文章生成等工作),还被应用在一些较特殊的领域——例如去年就有同学尝试使用 ChatGPT 作弊并被当场逮捕(全校被取消成绩)。相信聪明的你一定不会犯一样的错误! 言归正传,对于 GPT 类的 AI,一个使用方式受到不少年轻用户的欢迎——将 AI 变成猫娘: 部分公司使用 AI 进行网络营销,网友同样乐于使用“变猫娘”的方式进行反击。注意:图中内容与题目无关,如无法看到图片不影响解题。 当然,由于训练数据里并不区分道德或伦理倾向,因此如果不加审查,AI 会生成大量的、不一定符合社会公序良俗的内容。尽管关于这个问题仍有争论,但至少在比赛中,我们还是期望 AI 能用于对人类更有帮助的方向上,少来一点猫娘。 因此你的工作是实现一个审查内容的代码,用于对 AI 生成的内容的初步审定。更具体地说,你会得到一段由大小写字母、数字、空格及 ASCII 码范围内的标点符号的文字,以及若干个违禁词以及警告阈值,你需要首先检查内容里有多少违禁词,如果少于阈值个,则简单地将违禁词替换为<censored>;如果大于等于阈值个,则直接输出一段警告并输出有几个违禁词。 输入格式: 输入第一行是一个正整数 N (1≤N≤100),表示违禁词的数量。接下来的 N 行,每行一个长度不超过 10 的、只包含大小写字母、数字及 ASCII 码范围内的标点符号的单词,表示应当屏蔽的违禁词。 然后的一行是一个非负整数 k (0≤k≤100),表示违禁词的阈值。 最后是一行不超过 5000 个字符的字符串,表示需要检查的文字。 从左到右处理文本,违禁词则按照输入顺序依次处理;对于有重叠的情况,无论计数还是替换,查找完成后从违禁词末尾继续处理。 输出格式: 如果违禁词数量小于阈值,则输出替换后的文本;否则先输出一行一个数字,表示违禁词的数量,然后输出He Xie Ni Quan Jia!。 输入样例1: 5 MaoNiang SeQing BaoLi WeiGui BuHeShi 4 BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong. 输出样例1: BianCheng <censored> ba! <censored> De Hua Ye Keyi Shuo! BuYao <censored> NeiRong. 输入样例2: 5 MaoNiang SeQing BaoLi WeiGui BuHeShi 3 BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong. 输出样例2: 3 He Xie Ni Quan Jia! 输入样例3: 2 AA BB 3 AAABBB 输出样例3: <censored>A<censored>B 输入样例4: 2 AB BB 3 AAABBB 输出样例4: AA<censored><censored> 输入样例5: 2 BB AB 3 AAABBB 输出样例5: AAA<censored>B

时间: 2025-07-07 10:45:27 浏览: 9
<think>好的,我现在需要解决这个问题。题目是让我们编写一个程序,对输入的文字进行违禁词审查。当违禁词的数量少于给定的阈值k时,替换所有违禁词为<censored>;否则输出数量并给出警告。 首先,我得仔细看题目要求。题目中的几个关键点需要注意: 1. 输入顺序:违禁词是按照输入顺序依次处理的。比如如果有两个违禁词AB和BB,在处理文本的时候,应该先查找AB,再查找BB。例如样例4和样例5,输入顺序不同,结果也不同。 2. 处理方式是从左到右扫描文本,每当找到一个违禁词后,替换,并且从该词的末尾继续处理。也就是说,替换后的部分不会再次被检查。例如,样例3中的输入是AAABBB,违禁词是AA和BB。处理的时候,先找到AA,替换后变成<censored>A,剩下的部分是ABBB。然后继续处理剩下的字符串,这时候下一个可能的违禁词可能被找到。但需要根据顺序处理。 但是这里有个问题,替换后的文本是否会影响后续的查找?比如,如果替换后的文本中有新的违禁词,是否需要处理?根据样例3的输出,替换后的结果是<censored>A<censored>B。原输入是AAABBB,替换过程可能是这样的: 原字符串是AAABBB。首先,用AA替换为<censored>,此时字符串变成<censored>AABBB。剩下的部分是从索引2开始吗?或者替换后的字符串继续处理? 或者,正确的处理方式是,每当发现一个违禁词,就将该词替换,然后继续从该词结束的位置的下一个字符开始处理,而替换后的部分不会再次被检查。例如,当处理到位置0-1的AA时,替换为<censored>,然后下一个处理的起始位置是2。原来的字符串在替换之后变成<censored>AABBB。此时,原来的第三个字符是A,但现在替换后的字符串可能在位置2是A。然后后续的违禁词可能出现在新的位置吗? 或者,题目中的处理方式是在原文本中逐个检查违禁词,每次找到一个违禁词就替换,并且将指针移动到该词末尾之后的位置,继续检查。替换后的字符不影响后续的检查。例如,原文本中的字符被逐个处理,每次替换之后,替换的部分不会被重新扫描。例如,样例3中的输入是AAABBB,违禁词是AA和BB。处理过程: 原字符串是A A A B B B。 检查违禁词按照输入顺序,先检查AA,然后是BB。处理从左到右: 检查位置0开始的子串是否是任何一个违禁词。这里,违禁词的顺序是AA,然后是BB。所以应该按顺序检查每个违禁词吗?或者对于每个位置,按输入顺序检查是否有违禁词存在? 或者,处理逻辑应该是,对于原字符串的每一个可能的起始位置,按顺序检查所有的违禁词,一旦发现某个违禁词存在,就进行替换,并移动指针到该违禁词的结束位置之后,然后继续处理后面的部分。例如,在每一个起始位置i,按输入顺序遍历所有违禁词,看看是否有违禁词出现在i的位置,如果有,处理之,并移动i到i+len(word),然后继续。 比如,样例3中的情况: 原字符串是AAABBB,违禁词是AA和BB,顺序是先AA,后BB。处理的时候,从左到右: i=0,检查是否有违禁词以i开头。顺序是AA,BB。检查是否有AA出现。原字符串的前两个字符是AA,符合。替换为<censored>,此时count加1。然后i跳到0+2=2的位置。此时,字符串被替换后的部分应该是<censored>,然后剩下的部分是AABBB?或者替换后的整个字符串是<censored>AABBB?此时,原字符串的替换后的部分是否会被继续处理? 或者,这里的处理逻辑是,在替换过程中,原字符串被逐个处理,每次找到一个违禁词后,替换,然后继续处理剩下的部分。例如,原字符串被处理成替换后的字符串,而替换后的字符串中的字符不会被再次检查。比如,样例3中的原字符串是AAABBB。当找到第一个AA(位置0-1),替换为<censored>,然后继续处理位置2之后的字符。位置2之后是AABBB。此时,i=2,检查是否有违禁词以i开头。顺序是先检查AA。当前位置i=2的字符是A,i+1是A,所以存在AA。替换为<censored>,count加1。此时i跳到4。剩下的字符串是BBBB。此时i=4,检查是否有违禁词。此时违禁词是AA和BB。按顺序检查AA是否存在?在位置4,字符是B,所以不匹配。接着检查BB是否存在。位置4-5的字符是BB,所以替换为<censored>,count加1。此时i跳到6。剩下的字符串长度不够,处理结束。此时总共有3个违禁词?但样例3的输出是替换后的结果为<censored>A<censored>B。这说明替换后的结果可能不是这样? 或者样例3的输出是替换后的结果是<censored>A<censored>B,这说明替换过程可能并不是这样。例如,原字符串是AAABBB,替换后是AA被替换两次,BB被替换一次?或者可能我的理解有误? 样例3的输入是: 违禁词是AA和BB,k=3,输入字符串是AAABBB。输出是<censored>A<censored>B。所以原字符串的处理过程是: AAABBB → 首先,从左到右扫描,找到每个违禁词的位置。按照输入顺序,先找AA,再找BB。 处理逻辑可能是这样的:每次从左到右扫描整个字符串,查找是否有任何违禁词出现。但违禁词的检查顺序是按照输入顺序的。例如,对于每个可能的起始位置i,按顺序检查每个违禁词是否匹配,如果匹配其中一个,则替换,并跳过该词的长度,继续处理i+len的位置。同时,替换后的字符串中的字符不会再次被处理。 例如,原字符串AAABBB的处理过程: 初始字符串:AAABBB → 索引0-5。 i=0: 检查违禁词列表的第一个词AA。在i=0处,是否有AA?是的。替换为<censored>,count=1。然后i跳到0+2=2的位置。 现在处理i=2: 字符串从i=2开始是AABBB。检查违禁词列表的第一个词AA。在i=2处是否有AA?原字符串中的i=2是A,i+1是 B吗?原字符串i=2的字符是第三个字符,原字符串是AAABBB,所以索引0:A,1:A,2:A,3:B,4:B,5:B。哦,原字符串是三个A,三个B。即,原字符串是AAA BBB。所以,i=0处的AA是存在的。替换后,i移动到2。此时剩下的字符串是AABBB? 不,替换后的整个字符串是 <censored>AABBB。然后接下来的i=2是在替换后的字符串中的位置吗? 或者,原字符串的处理是逐个字符进行的,替换后的字符不影响后续处理。例如,处理过程是基于原字符串的,而不是替换后的字符串。这可能吗? 比如,可能处理逻辑是,在原始字符串中找到所有违禁词的出现位置,并记录这些位置的起始和结束索引。然后,根据这些位置进行替换。但是需要考虑重叠的情况,比如当一个违禁词被处理后,后面的处理不能覆盖前面的替换区域。 例如,处理违禁词的顺序是按输入顺序,并且每当发现一个违禁词的出现,就记录下来,并且在替换后,后面的处理只能在该词的结束位置之后进行。这类似于非重叠的匹配,但每次找到的匹配必须按照输入顺序的违禁词优先? 或者,处理的方式是,在原始字符串中,按顺序检查每个违禁词的出现,并替换所有出现的该词。例如,先处理第一个违禁词,替换所有出现,再处理第二个违禁词,替换所有出现。但这样的话,顺序可能影响结果。比如,样例4和5中的情况,输入顺序不同导致结果不同。所以必须按照输入顺序处理违禁词,并且对于每个违禁词,在原始字符串中找到所有出现的位置,替换,并且替换后的部分不影响后续处理? 比如,对于样例4中的情况: 违禁词是AB和BB。输入字符串是AAABBB。处理顺序是先AB,后BB。 首先处理AB。在字符串中查找所有AB的出现。AAABBB中是否存在AB?原字符串是AAA BBB。可能没有AB。所以处理AB的时候,没有替换。接着处理BB,查找所有BB的出现。例如,在位置3-4和4-5处有BB。替换这两个为<censored>,所以结果会是AAA<censored><censored>,即样例4的输出。 而样例5中的违禁词顺序是BB和AB。输入字符串同样是AAABBB。处理顺序是先处理BB,再处理AB。在处理BB的时候,查找所有BB的出现。原字符串中的位置3-4和4-5的BB会被替换。替换之后,字符串变成 AAA<censored><censored>。然后处理AB,这时候原字符串中已经没有AB了,所以结果如样例5的输出。 但样例5的输出是AAA<censored>B,这说明我的上述分析可能有误。所以需要重新理解样例的处理逻辑。 样例5的输入是违禁词顺序BB,AB。原字符串是AAABBB。处理过程: 首先处理BB。在原始字符串中,BB出现在位置3-4和4-5。替换这两个,所以原字符串被替换为AAA<censored><censored>。那么此时总共有两个违禁词替换。然后处理AB。在替换后的字符串中,是否存在AB?原字符串中的处理后的字符串是AAA<censored><censored>,其中<censored>是替换后的文本。所以,原字符串处理后的字符串是AAA加上两个<censored>。其中每个<censored>是替换后的字符串。比如,原BB被替换为<censored>,所以每个替换后的部分占用了原BB的两个字符的位置。例如,原字符串的每个BB是两个字符,替换为<censored>(10个字符)。但这会影响后续的处理吗? 或者,是否在替换之后,字符串的结构发生了变化,但处理的时候,总是基于原始字符串的位置进行处理? 或者,处理的时候,原字符串被逐个处理,每次找到一个违禁词的位置,替换,并且移动指针到该词结束的位置之后,而不处理替换后的字符串中的内容。也就是说,替换后的字符串中的字符不会被再次扫描。 比如,原始字符串的处理方式是,按顺序从左到右扫描,每当找到一个违禁词(按照输入顺序的违禁词列表中的词),替换并跳过该词的长度,继续处理后面的部分。这类似于非贪婪的匹配,但每次优先匹配输入顺序中较早的违禁词。 举个例子,样例3中的处理: 原字符串是AAABBB,违禁词是AA和BB。处理顺序是AA先,然后BB。 处理过程: 初始指针在0的位置。检查是否有违禁词以当前指针位置开始。对于每个违禁词,按输入顺序检查。 在指针0的位置,检查是否存在AA。是的,所以替换为<censored>,count加1。然后指针移动到2的位置。 在指针2的位置,检查是否存在违禁词。此时,原字符串中从2开始的是AABBB。检查输入顺序的违禁词,第一个是AA。在指针2的位置,检查是否AA存在。是的,因为原字符串的2和3是A和B?或者原字符串是AAABBB吗? 原字符串应该是三个A,接着三个B。所以,位置0是A,1是A,2是A,3是B,4是B,5是B。所以,当指针在2的位置时,检查是否有违禁词AA。原字符串中的位置2和3是A和 B,所以不匹配。因此,违禁词AA无法匹配。接着检查下一个违禁词BB。此时,从位置2开始的子字符串是ABBB。所以,是否有BB存在?位置2是A,后面是B,所以没有。所以,指针2处没有违禁词。指针移动到3的位置。 在指针3的位置,检查违禁词。输入顺序中的第一个是AA,此时位置3是B,所以不匹配。接着检查BB。位置3和4是BB,所以存在。替换为<censored>,count加1。指针移动到5的位置。 在指针5的位置,检查是否有违禁词。此时位置5是B,后面没有字符。所以,处理结束。总共有两个违禁词。但是样例3的输出是替换后的结果为<censored>A<censored>B。这说明替换后的结果与原字符串的处理方式可能不是这样。或者可能我的理解有误? 或者,可能我误解了样例3的情况。原样例3的输出是输入字符串AAABBB,违禁词是AA和BB,阈值3。替换后的结果是<censored>A<censored>B。这说明总共有两个违禁词被替换,但样例3的输出中替换后的字符串有三个<censored>?或者,原字符串中的违禁词数目是3? 样例3的输出是<censored>A<censored>B。所以替换后的字符串中有两个<censored>吗?例如,原字符串AAABBB被替换为: AA→<censored>,那么前两个A被替换,第三个A保留。后面的BBB中,前两个B被替换为<censored>,第三个B保留?所以总共有两个替换? 或者,可能我的理解错误。样例3的输出是替换后的结果为 <censored>A<censored>B。那原字符串是AAABBB。处理过程可能如下: 原字符串中的三个A:AAABBB可以被拆分为AAA BBB。违禁词是AA和BB。处理顺序是先AA,然后BB。 处理过程: 指针i=0时,检查是否有AA。发现AA(位置0-1),替换为<censored>,count加1。i跳到2的位置。 此时i=2,原字符串中的字符是A。检查是否有AA?当前位置i=2,剩下一个字符A,不够长度,所以无法匹配AA。接着检查是否有BB?同样不够长度。指针i=3的位置。 i=3时,原字符是B。检查是否有AA?不。检查是否有BB?当前位置i=3和i+1=4是BB,符合。替换为<censored>,count加1。i跳到5的位置。 i=5时,原字符是B。检查是否有违禁词。剩下的字符长度是1,不够长度。所以处理结束。总共有两个违禁词。但样例3的输出替换后的字符串是<censored>A<censored>B,这说明替换后的字符串中有两个<censored>,所以总共有两个违禁词,但输入的k是3。所以样例3的输出应该是替换后的结果,因为2<3。所以输出替换后的结果。所以输出是<censored>A<censored>B。原字符串替换后的结果应该是: 原AAABBB → 替换后的字符串: 替换前两个A为<censored>,得到 <censored>A。剩下的ABBB?或者原处理过程是每次替换后的字符串中的字符会被处理? 可能我在这里的理解有误。比如,当替换完AA后,原字符串中的后续部分是否被处理?比如,替换后的字符串中的A是否会被重新处理? 或者,处理过程中,替换后的字符串中的字符不会影响后续的扫描。例如,扫描是基于原字符串的,所有违禁词的位置是在原字符串中找到的,然后替换后的字符串由这些位置决定,不管替换后的字符串是否包含其他违禁词。例如,每个违禁词的替换是基于原字符串中的位置,而不是处理后的字符串。例如,所有违禁词的位置在原字符串中找到,然后一次性替换所有,但需要考虑顺序和非重叠的条件。 这似乎比较复杂。例如,如何按顺序处理违禁词,并确保每次替换后的部分不会再次被处理? 或许正确的处理逻辑是: 从左到右扫描原字符串的每个字符,按顺序检查每个违禁词是否出现在当前位置。一旦发现某个违禁词,就替换,并将指针移动到该词末尾之后的位置,不再处理该词内的字符。这样,替换后的字符不影响后续处理。而违禁词的检查顺序是按照输入顺序的。例如,在当前位置i,按输入顺序依次检查每个违禁词,看是否在i的位置出现。如果有,替换,i跳到i+len,否则继续检查下一个违禁词。如果所有违禁词都不匹配,则i增加1。 例如,样例3中的处理: 原字符串AAABBB,i=0: 检查违禁词列表中的第一个词AA。原字符串i=0开始的子串是AA,匹配。替换为<censored>,count=1。i跳到0+2=2。 此时i=2: 检查违禁词列表中的第一个词AA。原字符串i=2开始的子串是A(剩下的长度可能不够,或者原i=2是第三个字符A,但长度可能不足。违禁词AA的长度是2,所以需要检查i+1的位置是否存在。i=2时,原字符串的长度是6,i+1=3存在。所以原字符串i=2和i+1=3是A和B。所以不匹配。接着检查第二个违禁词BB。原字符串i=2开始的子串是AB,所以不匹配。此时,i增加到3。 i=3: 检查第一个违禁词AA?原i=3是B,不匹配。检查第二个违禁词BB。i=3开始的子串是BB,匹配。替换为<censored>,count=2。i跳到3+2=5。 i=5: 检查是否有足够的长度。原字符串i=5是B,长度不够,i增加到6。结束。 此时,总共有2个违禁词。替换后的字符串是: 原字符串中的0-1替换为<censored>,得到 <censored>;原3-4替换为<censored>,得到 <censored>。中间的字符i=2是A,i=5是B。所以替换后的字符串是 <censored>A <censored> B → <censored>A<censored>B。这与样例3的输出一致。所以在这种情况下,处理是正确的。这说明处理逻辑是按顺序检查每个违禁词,当发现匹配时替换,并移动i到该词末尾之后的位置,而后续处理不会重新处理已替换的部分。 因此,正确的处理流程应该是: - 遍历原字符串中的每个字符,从i=0开始。 - 对于每个i,按输入顺序检查每个违禁词: a. 如果当前i到i+len(word)-1的子串等于该违禁词,则: i. 替换该子串为 <censored> ii. 计数器加1 iii. i移动到i + len(word)的位置,跳出当前循环,继续处理后面的字符 b. 否则,继续检查下一个违禁词 - 如果没有任何违禁词匹配,i增加1 这样,处理过程中,每个位置i会被检查,如果某个违禁词匹配,则替换,并跳过该词的长度,否则i逐步增加。 现在,如何实现这样的逻辑? 这个问题可以分为以下几个步骤: 1. 读取输入:首先读取N,然后是N个违禁词。接着读取k,最后读取待检查的字符串。 2. 处理字符串,统计违禁词数量,并进行替换。替换时需要按照上述逻辑进行。 3. 根据违禁词数量与k的比较,输出结果。 现在,问题是如何高效地处理替换。因为原字符串可能很长(5000字符),而替换操作可能需要频繁修改字符串,这可能比较耗时。但对于Python来说,处理这样的字符串应该没问题。 但需要注意的是,字符串是不可变的,所以每次替换都需要生成新的字符串,这可能效率较低。或者,可以将字符串转换为列表,处理时替换对应位置的字符。但更高效的方式可能是在遍历过程中记录需要替换的位置,最后一次性生成替换后的字符串。但如何处理重叠的替换? 或者,可以采用逐个字符处理的方法,维护一个指针i,从0开始,每次找到匹配的违禁词,替换并移动指针,否则移动指针。 具体来说: 初始化i=0,count=0,结果字符串的列表为res。 然后,循环处理: 当i <= len(s) -1: matched = False for word in banned_order: len_word = len(word) if i + len_word > len(s): continue substring = s[i:i+len_word] if substring == word: # 匹配到违禁词 res.append('<censored>') count +=1 i += len_word matched = True break if not matched: res.append(s[i]) i +=1 这样,处理过程是按照顺序检查每个违禁词,当发现匹配时替换,并移动i到i+len_word的位置。否则,将当前字符加入结果,i加1。 这样处理的话,可以确保每个字符或违禁词被处理一次,不会重复处理。例如,原字符串中的字符被逐个处理,替换后的字符串中的字符不会被再次处理,因为处理是基于原字符串的。 但这种方法是否正确? 例如,样例3中的处理: 原字符串是AAABBB,违禁词是AA和BB。 i=0时,检查违禁词列表中的第一个词AA。原字符串i=0到i+1是AA,匹配。替换为<censored>,count=1,i跳到2。 i=2,检查违禁词列表中的第一个词AA。原字符串i=2到3是AB(假设原字符串是AAABBB?不,原字符串是三个A,然后是三个B。所以i=2的位置是第三个A,i+1是第四个字符,即B。所以s[2:4]是 AB?或者s[i:i+len_word],其中 len_word=2。所以i=2时,检查s[2:4],即字符是A(位置2)和 B(位置3),所以子串是AB,不等于AA。所以不匹配。接着检查第二个违禁词BB。子串是AB吗?同样不匹配。所以,没有匹配的违禁词。此时,将s[2](A)加入结果,i=3。 i=3时,检查第一个违禁词AA。s[3]是 B,所以不匹配。检查第二个违禁词BB。子串是s[3:5]即 BB,匹配。替换为<censored>,count=2。i跳到5。 i=5时,检查违禁词。s[5]是B,检查第一个词AA,不匹配。检查第二个词BB。子串是s[5:7],但7超过长度,所以不匹配。所以将s[5]加入结果,i=6。循环结束。 最终结果列表是: 在i=0时,添加<censored>,i=2。i=2时,添加A。i=3时,添加<censored>。i=5时,添加B。所以结果字符串是 <censored>A<censored>B。这与样例3的输出一致。这说明这种方法是对的。 再看样例4: 违禁词顺序是AB、BB。输入字符串是AAABBB。 处理过程: i=0: 检查违禁词AB。子串是AA,不匹配。下一个词BB?子串是AA,不匹配。没有匹配,所以将A加入结果,i=1. i=1: 检查AB?子串是AA,不匹配。检查BB?子串是AA,不匹配。加入A,i=2. i=2: 检查AB?子串是AB(s[2:4]?原字符串是AAABBB。i=2是第三个A,i+1=3是 B。所以子串是AB。等于违禁词AB吗?违禁词列表中的第一个违禁词是AB。所以匹配。替换为<censored>,count=1。i跳到4. i=4: 检查AB?子串是s[4:6]是BB。不匹配。检查BB,子串是BB。匹配。替换为<censored>,count=2。i跳到6. i=6结束。结果列表是 AA(前两个字符)替换为A和A?或者原处理过程: 原字符串是AAABBB。i=0时,没有匹配,所以添加A,i=1。i=1时,同样没有匹配,添加A,i=2。此时,i=2的子串AB(A和B),所以替换为<censored>,count=1。i跳到4。i=4的子串是BB(位置4和5),匹配违禁词列表中的第二个违禁词BB。替换为<censored>,count=2。i跳到6。结果字符串是 AA<censored><censored>。这与样例4的输出一致。 而样例5的违禁词顺序是BB、AB。处理原字符串AAABBB: i=0时,检查第一个违禁词BB。子串是AA,不匹配。检查AB?不匹配。所以添加A,i=1. i=1,同样处理,添加A,i=2. i=2,检查BB?子串是AB(i=2和3是A和 B?原字符串中的i=2是第三个A,i+1=3是B。所以子串AB。违禁词列表中的第一个词是BB,所以不匹配。检查AB?是的。如果AB是第二个违禁词?在样例5的输入中,违禁词顺序是BB和AB。所以,在i=2的位置,首先检查BB?子串是AB,不匹配。然后检查AB?是的。所以替换为<censored>,count=1。i跳到4. i=4,子串是s[4:6]是BB。检查违禁词列表的第一个词BB,匹配。替换,count=2。i跳到6。结果字符串是 AAA<censored>B。这与样例5的输出一致。 因此,这种处理逻辑是正确的。 现在,如何用Python实现? 步骤: 1. 读取输入: - N:读取第一行,转换为整数。 - 接下来的N行,读取N个违禁词,保存为一个列表,保持输入顺序。 - k:读取下一行,转换为整数。 - 最后一行是待检查的字符串s。 2. 处理字符串: 初始化结果列表res,count=0,i=0. while i <= len(s) -1: matched = False for word in banned_words: len_word = len(word) if i + len_word > len(s): continue if s[i:i+len_word] == word: res.append('<censored>') count +=1 i += len_word matched = True break if not matched: res.append(s[i]) i +=1 3. 根据count和k的比较: if count <k: print(''.join(res)) else: print(count) print("He Xie Ni Quan Jia!") 这样就能得到正确的结果。 现在需要考虑特殊情况,比如违禁词可能包含特殊字符,比如标点符号。但题目说明违禁词只包含大小写字母、数字及ASCII标点符号,而字符串处理时是按原样比较的,所以直接比较即可。 例如,违禁词是包含标点的,如"hello!",那么只有当原字符串中的对应子串完全匹配才会被替换。 测试样例3、4、5的情况,输出正确。 这样,代码的大体结构是正确的。 现在,需要注意的细节: - 违禁词可能有长度不同的情况,例如有的词长,有的词短。处理时,要确保在i的位置,检查所有违禁词是否匹配,按输入顺序。 - 当有多个违禁词在同一个i位置都可能匹配时,按照输入顺序选择第一个匹配的词进行替换。例如,如果违禁词是['AB', 'A'],在字符串中i=0的位置遇到A,会先检查AB是否存在,不存在的话,再检查A是否存在,如果存在则替换。 但按照我们的处理逻辑,每个i位置,按顺序检查所有违禁词,一旦找到匹配的,就处理。所以,长度较长的词优先吗?比如,在违禁词列表中有更长的词时,只有当更长的词不匹配才会处理短的。例如,假设违禁词是AB和A。对于字符串AB,i=0时,检查AB是否匹配(是的),替换,i跳到2。而如果违禁词顺序是A和 AB,那么在i=0时,检查A,发现匹配,替换,i跳到1,剩下的B被处理。此时,AB不会被替换。 所以在处理时,违禁词的顺序非常重要。必须按照输入顺序依次检查。 综上,代码的逻辑是正确的。现在编写Python代码: 例如,样例1的处理: 输入: 5 MaoNiang SeQing BaoLi WeiGui BuHeShi 4 BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong. 处理过程: 字符串中的违禁词是MaoNiang、WeiGui、BaoLi。这三个词会被替换。总共有3个违禁词,小于k=4。所以输出替换后的字符串。 代码会正确替换这些词为<censored>。 样例2中,总共有3个违禁词,等于k=3,所以输出3和警告信息。 综上,代码应该可以正确处理所有情况。</think>要解决这个问题,我们需要编写一个程序来审查输入文本中的违禁词,并根据违禁词的数量与给定阈值的比较结果输出相应内容。以下是详细的解决方案: ### 方法思路 1. **输入处理**:首先读取输入的违禁词数量、违禁词列表、阈值和待检查的文本。 2. **文本处理**:从左到右遍历文本,按顺序检查每个位置是否匹配任一违禁词。若匹配,则替换为`<censored>`,并跳过该词长度继续处理后续文本;若不匹配,则继续检查下一个字符。 3. **结果判断**:根据违禁词数量与阈值的比较,输出替换后的文本或警告信息。 ### 解决代码 ```python n = int(input()) banned_words = [input().strip() for _ in range(n)] k = int(input()) s = input().strip() res = [] count = 0 i = 0 len_s = len(s) while i < len_s: matched = False for word in banned_words: word_len = len(word) if i + word_len > len_s: continue if s[i:i+word_len] == word: res.append('<censored>') count += 1 i += word_len matched = True break if not matched: res.append(s[i]) i += 1 if count < k: print(''.join(res)) else: print(count) print("He Xie Ni Quan Jia!") ``` ### 代码解释 1. **输入读取**:读取违禁词数量`n`,接着读取`n`个违禁词存入列表`banned_words`,然后读取阈值`k`和待检查的文本`s`。 2. **初始化变量**:`res`列表存储处理后的结果,`count`统计违禁词数量,`i`作为当前处理位置的指针。 3. **遍历文本**:使用`while`循环逐个字符处理文本。对于每个位置`i`,按顺序检查所有违禁词是否匹配当前位置开始的子串。若匹配,则替换为`<censored>`,更新计数并跳过该词长度;否则将当前字符加入结果并继续处理下一个字符。 4. **结果输出**:根据违禁词数量与阈值的比较,输出替换后的文本或警告信息。 该方法确保从左到右处理文本,严格按输入顺序检查违禁词,避免重复处理已替换部分,保证了正确性和效率。
阅读全文

相关推荐

#include<bits/stdc++.h> using namespace std; int main() {int n;string a[105];string s;int k,m=0,lo;string w,e; cin>>n; for(int i=1;i<=n;i++) {cin>>a[i];}//屏蔽违禁词 cin>>k;//违禁词值 cin>>s;//总文本 for(int i=1;i<=n;i++) { if(s.find(a[i])) {m++;} if(m<k) { lo=a[i].size(); w=s.substr(0,s.find(a[i])); e=s.substr(s.find(a[i])+lo); s=w+"<censored>"+e; } else { cout<<m<<endl; cout<<"He Xie Ni Quan Jia!"<<endl; return 0; } cout<<s<<endl; return 0; }}7-5 别再来这么多猫娘了!分数 15 全屏浏览 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 以 GPT 技术为核心的人工智能系统出现后迅速引领了行业的变革,不仅用于大量的语言工作(如邮件编写或文章生成等工作),还被应用在一些较特殊的领域——例如去年就有同学尝试使用 ChatGPT 作弊并被当场逮捕(全校被取消成绩)。相信聪明的你一定不会犯一样的错误! 言归正传,对于 GPT 类的 AI,一个使用方式受到不少年轻用户的欢迎——将 AI 变成猫娘: 部分公司使用 AI 进行网络营销,网友同样乐于使用“变猫娘”的方式进行反击。注意:图中内容与题目无关,如无法看到图片不影响解题。 当然,由于训练数据里并不区分道德或伦理倾向,因此如果不加审查,AI 会生成大量的、不一定符合社会公序良俗的内容。尽管关于这个问题仍有争论,但至少在比赛中,我们还是期望 AI 能用于对人类更有帮助的方向上,少来一点猫娘。 因此你的工作是实现一个审查内容的代码,用于对 AI 生成的内容的初步审定。更具体地说,你会得到一段由大小写字母、数字、空格及 ASCII 码范围内的标点符号的文字,以及若干个违禁词以及警告阈值,你需要首先检查内容里有多少违禁词,如果少于阈值个,则简单地将违禁词替换为<censored>;如果大于等于阈值个,则直接输出一段警告并输出有几个违禁词。 输入格式: 输入第一行是一个正整数 N (1≤N≤100),表示违禁词的数量。接下来的 N 行,每行一个长度不超过 10 的、只包含大小写字母、数字及 ASCII 码范围内的标点符号的单词,表示应当屏蔽的违禁词。 然后的一行是一个非负整数 k (0≤k≤100),表示违禁词的阈值。 最后是一行不超过 5000 个字符的字符串,表示需要检查的文字。 从左到右处理文本,违禁词则按照输入顺序依次处理;对于有重叠的情况,无论计数还是替换,查找完成后从违禁词末尾继续处理。 输出格式: 如果违禁词数量小于阈值,则输出替换后的文本;否则先输出一行一个数字,表示违禁词的数量,然后输出He Xie Ni Quan Jia!。 输入样例1: 5 MaoNiang SeQing BaoLi WeiGui BuHeShi 4 BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong. 输出样例1: BianCheng <censored> ba! <censored> De Hua Ye Keyi Shuo! BuYao <censored> NeiRong. 输入样例2: 5 MaoNiang SeQing BaoLi WeiGui BuHeShi 3 BianCheng MaoNiang ba! WeiGui De Hua Ye Keyi Shuo! BuYao BaoLi NeiRong. 输出样例2: 3 He Xie Ni Quan Jia! 输入样例3: 2 AA BB 3 AAABBB 输出样例3: <censored>A<censored>B 输入样例4: 2 AB BB 3 AAABBB 输出样例4: AA<censored><censored> 输入样例5: 2 BB AB 3 AAABBB 输出样例5: AAA<censored>B 出错点

最新推荐

recommend-type

新版青岛奥博软件公司营销标准手册.docx

新版青岛奥博软件公司营销标准手册.docx
recommend-type

500强企业管理表格模板大全

在当今商业环境中,管理表格作为企业运营和管理的重要工具,是确保组织高效运作的关键。世界500强企业在管理层面的成功,很大程度上得益于它们的规范化和精细化管理。本文件介绍的“世界500强企业管理表格经典”,是一份集合了多种管理表格模板的资源,能够帮助管理者们更有效地进行企业规划、执行和监控。 首先,“管理表格”这个概念在企业中通常指的是用于记录、分析、决策和沟通的各种文档和图表。这些表格不仅仅局限于纸质形式,更多地是以电子形式存在,如Excel、Word、PDF等文件格式。它们帮助企业管理者收集和整理数据,以及可视化信息,从而做出更加精准的决策。管理表格可以应用于多个领域,例如人力资源管理、财务预算、项目管理、销售统计等。 标题中提及的“世界500强”,即指那些在全球范围内运营且在《财富》杂志每年公布的全球500强企业排行榜上出现的大型公司。这些企业通常具备较为成熟和先进的管理理念,其管理表格往往经过长时间的实践检验,并且能够有效地提高工作效率和决策质量。 描述中提到的“规范化”是企业管理中的一个核心概念。规范化指的是制定明确的标准和流程,以确保各项管理活动的一致性和可预测性。管理表格的使用能够帮助实现管理规范化,使得管理工作有据可依、有章可循,减少因个人经验和随意性带来的风险和不确定性。规范化管理不仅提高了企业的透明度,还有利于培养员工的规则意识,加强团队之间的协调与合作。 “经典”一词在这里强调的是,这些管理表格模板是经过实践验证,能够适用于大多数管理场景的基本模式。由于它们的普适性和高效性,这些表格模板被广泛应用于不同行业和不同规模的企业之中。一个典型的例子是SWOT分析表,它可以帮助企业识别内部的优势(Strengths)、弱点(Weaknesses)以及外部的机会(Opportunities)和威胁(Threats)。SWOT分析表就是一个在世界500强企业中普遍使用的管理表格。 标签中的“表格模板”则是对上述管理工具的具体描述。这些模板通常是预先设计好的,能够帮助企业管理者快速开始工作,无需从零开始制作新的表格。它们包含了一些必备的字段和格式,用户可以根据自己的具体需求对模板进行调整和填充。 文件名称列表中的“index.html”可能是压缩包内的一个网页文件,用于展示管理表格的索引或介绍。如果这是一个在线资源,它将允许用户通过网页界面访问和下载各种表格模板。而“menu”可能是一个导航文件,用来帮助用户在多个表格模板之间进行选择。“data”文件夹可能包含了实际的表格模板文件,它们可能以Excel、Word等格式存在。 总的来说,管理表格是企业成功管理不可或缺的工具。通过使用世界500强企业所采纳的管理表格模板,其他企业可以借鉴这些顶级企业的管理经验,帮助自己在管理实践中达到更高的效率和质量。通过规范化和模板化的管理表格,企业可以确保其管理活动的一致性和标准化,这对于保持竞争力和实现长期发展至关重要。
recommend-type

YOLOv8目标检测算法深度剖析:从零开始构建高效检测系统(10大秘诀)

# 1. YOLOv8目标检测算法概述 ## 1.1 YOLOv8的简介与定位 YOLOv8(You Only Look Once version 8)作为一种前沿的目标检测算法,是由YOLO系列算法演化而来。该算法特别强调快速与准确的平衡,它被设计用于实时图像识别
recommend-type

mclmcrrt9_8.dll下载

<think>我们正在处理用户关于"mclmcrrt9_8.dll"文件的下载请求。根据引用内容,这个文件是MATLAB运行时库的一部分,通常与特定版本的MATLABRuntime相关联。用户需求:下载mclmcrrt9_8.dll的官方版本。分析:1.根据引用[2]和[3],mclmcrrt9_0_1.dll和mclmcrrt9_13.dll都是MATLABRuntime的文件,版本号对应MATLAB的版本(如9_0对应R2016a,9_13对应2022b)。2.因此,mclmcrrt9_8.dll应该对应于某个特定版本的MATLAB(可能是R2016b?因为9.8版本通常对应MATLABR
recommend-type

林锐博士C++编程指南与心得:初学者快速提能

首先,这份文件的核心在于学习和提高C++编程能力,特别是针对初学者。在这个过程中,需要掌握的不仅仅是编程语法和基本结构,更多的是理解和运用这些知识来解决实际问题。下面将详细解释一些重要的知识点。 ### 1. 学习C++基础知识 - **基本数据类型**: 在C++中,需要熟悉整型、浮点型、字符型等数据类型,以及它们的使用和相互转换。 - **变量与常量**: 学习如何声明变量和常量,并理解它们在程序中的作用。 - **控制结构**: 包括条件语句(if-else)、循环语句(for、while、do-while),它们是构成程序逻辑的关键。 - **函数**: 理解函数定义、声明、调用和参数传递机制,是组织代码的重要手段。 - **数组和指针**: 学习如何使用数组存储数据,以及指针的声明、初始化和运算,这是C++中的高级话题。 ### 2. 林锐博士的《高质量的C++编程指南》 林锐博士的著作《高质量的C++编程指南》是C++学习者的重要参考资料。这本书主要覆盖了以下内容: - **编码规范**: 包括命名规则、注释习惯、文件结构等,这些都是编写可读性和可维护性代码的基础。 - **设计模式**: 在C++中合理使用设计模式可以提高代码的复用性和可维护性。 - **性能优化**: 学习如何编写效率更高、资源占用更少的代码。 - **错误处理**: 包括异常处理和错误检测机制,这对于提高程序的鲁棒性至关重要。 - **资源管理**: 学习如何在C++中管理资源,避免内存泄漏等常见错误。 ### 3. 答题与测试 - **C++C试题**: 通过阅读并回答相关试题,可以帮助读者巩固所学知识,并且学会如何将理论应用到实际问题中。 - **答案与评分标准**: 提供答案和评分标准,使读者能够自我评估学习成果,了解哪些方面需要进一步加强。 ### 4. 心得体会与实践 - **实践**: 理论知识需要通过大量编程实践来加深理解,动手编写代码,解决问题,是学习编程的重要方式。 - **阅读源码**: 阅读其他人的高质量代码,可以学习到许多编程技巧和最佳实践。 - **学习社区**: 参与C++相关社区,比如Stack Overflow、C++论坛等,可以帮助解答疑惑,交流心得。 ### 5. 拓展知识 - **C++标准库**: 学习C++标准模板库(STL),包括vector、map、list、algorithm等常用组件,是构建复杂数据结构和算法的基础。 - **面向对象编程**: C++是一种面向对象的编程语言,理解类、对象、继承、多态等概念对于写出优雅的C++代码至关重要。 - **跨平台编程**: 了解不同操作系统(如Windows、Linux)上的C++编程差异,学习如何编写跨平台的应用程序。 - **现代C++特性**: 学习C++11、C++14、C++17甚至C++20中的新特性,如智能指针、lambda表达式、自动类型推导等,可以提高开发效率和代码质量。 ### 总结 学习C++是一个系统工程,需要从基础语法开始,逐步深入到设计思想、性能优化、跨平台编程等领域。通过不断的学习和实践,初学者可以逐步成长为一个具有高代码质量意识的C++程序员。而通过阅读经典指南书籍,参与测试与评估,以及反思和总结实践经验,读者将更加扎实地掌握C++编程技术。此外,还需注意编程社区的交流和现代C++的发展趋势,这些都对于保持编程技能的前沿性和实用性是必不可少的。
recommend-type

线性代数方程组求解全攻略:直接法vs迭代法,一文搞懂

# 摘要 线性代数方程组求解是数学和工程领域中的基础而重要的问题。本文首先介绍了线性方程组求解的基础知识,然后详细阐述了直接法和迭代法两种主要的求解策略。直接法包括高斯消元法和LU分解方法,本文探讨了其理论基础、实践应用以及算法优化。迭代法则聚焦于雅可比和高斯-赛德尔方法,分析了其原理、实践应用和收敛性。通过比较分析,本文讨论了两种方法在
recommend-type

怎么下载mysql8.0.33版本

<think>我们正在处理用户关于下载并安装MySQL8.0.33版本的问题。根据引用[1]和引用[2],我们可以提供两种方法:一种是使用RPM包在CentOS上安装,另一种是使用ZIP包在Windows上安装。另外,引用[3]提到了安装过程中需要注意Python环境,但根据MySQL官方文档,Python并不是必须的,除非使用某些特定功能(如MySQLShell的Python模式)。因此,我们主要关注下载和安装步骤。用户没有明确操作系统,因此我们将分别介绍Windows和CentOS(Linux)下的安装方法。步骤概述:1.下载MySQL8.0.332.安装(根据系统不同步骤不同)3.初始化
recommend-type

C#学籍管理系统开发完成,信管专业的福音

标题中提到的“C#设计的学籍系统”涉及到几个重要的知识点。首先是“C#”,这是微软公司开发的一种面向对象的、运行在.NET框架上的高级编程语言。C#语言广泛用于开发Windows应用程序、游戏开发、分布式组件和客户端服务器应用程序等。在该标题中,它被用于构建一个学籍系统,这意味着系统的核心逻辑和功能是通过C#语言实现的。 其次是“学籍系统”,这通常是指用于管理学生个人信息、成绩、课程和学籍状态等数据的软件应用系统。学籍系统能够帮助教育机构高效地维护和更新学生档案,实现学生信息的电子化管理。它通常包括学生信息管理、成绩管理、课程安排、毕业资格审核等功能。 从描述中我们可以得知,这个学籍系统是“专门为信管打造”的。这里的“信管”很可能是对“信息管理”或者“信息系统管理”专业的简称。信息管理是一个跨学科领域,涉及信息技术在收集、存储、保护、处理、传输和安全地管理和开发信息资源方面的应用。这个系统可能是针对该专业学生的实际需求来定制开发的,包括一些特有的功能或者界面设计,以便更好地满足专业学习和实践操作的需要。 描述中还提到“请大家积极下载”,这可能意味着该学籍系统是一个开源项目,或者至少是一个允许公众访问的软件资源。由于开发者提出了“如有不足之处请大家多多包涵”,我们可以推断这个系统可能还处于测试或早期使用阶段,因此可能还不是完全成熟的版本,或者可能需要使用者反馈意见以便进行后续改进。 标签中的“C#的啊,大家注意,嘻嘻哈哈”表达了开发者轻松的态度和对C#语言的特定提及。这个标签可能是在一个非正式的交流环境中发布的,所以用词带有一定的随意性。尽管如此,它还是说明了该学籍系统是基于C#语言开发的,并提醒用户对这一点给予关注。 关于压缩包子文件的文件名称列表中,“学生成绩管理系统”直接指出了这个软件系统的主要功能之一,即管理学生的成绩。这通常包括录入成绩、查询成绩、统计分析成绩、成绩报告等功能。一个优秀的学生成绩管理系统可以让教师和学校管理人员更加高效地处理学生的成绩数据,同时也能让学生本人了解自己的学业进展。 综合以上信息,我们可以提炼出以下知识点: 1. C#语言:是一种面向对象的编程语言,适用于.NET框架,用于开发各种类型的应用程序。 2. 学籍系统:是管理学生基本信息、成绩、课程和学籍状态的软件应用系统,目的是实现学生信息的电子化管理。 3. 信息系统管理专业:该系统可能是针对信息系统管理专业的学生或教师的需求设计和开发的。 4. 开源项目或公众访问资源:鼓励用户下载使用,并接受用户的反馈和建议。 5. 学生成绩管理系统:是学籍系统的一个重要组成部分,专注于管理学生的成绩数据。 在开发一个C#设计的学籍系统时,开发者需要考虑的因素很多,比如系统的用户界面设计、数据库设计、数据安全、网络通信等。此外,系统还应该有良好的扩展性和易用性,以便未来可以根据用户反馈和新需求进行升级和优化。
recommend-type

特征值与特征向量速成课:理论精讲与7种高效算法

# 摘要 本文系统地介绍了特征值与特征向量的基本概念、理论深度剖析、高效特征值算法以及这些数学工具在实际问题中的应用。首先从定义与性质出发,详细解释了特征值与特征向量的
recommend-type

嵌入式Linux读写硬盘数据错误CF2 13473a 13433a 1342b2 13473a解决方案

<think>嗯,用户这次提出的问题很专业,是关于嵌入式Linux系统硬盘读写错误的解决方案。从错误代码CF2、13473a等来看,这应该是特定硬盘控制器或文件系统的错误码,需要结合硬件和系统环境分析。用户可能正在调试一个嵌入式设备,遇到了硬盘读写不稳定问题。这类错误通常涉及硬件连接、驱动兼容性、文件系统损坏等多个层面。用户提供的错误码格式看起来像十六进制值,可能是控制器寄存器状态或SCSI检测码。考虑到嵌入式系统的特殊性,需要从底层开始排查。首先应该检查物理连接,因为振动或接触不良在嵌入式环境中很常见。然后是驱动兼容性,嵌入式Linux常使用定制内核,驱动版本匹配很重要。另外,用户没有说明文