news 2026/7/22 9:43:46

UVa 10438 Meta Editor

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 10438 Meta Editor

题目描述

给定一行由若干英文单词组成的文本,每个单词长度不超过505050个字符,单词之间由一个或多个空格或制表符分隔。需要对这行文本进行“语法修正”,即反复删除所有相邻且完全相同的等长连续单词子串中的后一个子串,直到不存在任何这样的相邻重复块为止。最终输出压缩后的单词序列,单词之间仅用一个空格分隔。

输入格式

输入包含若干行文本。每行包含若干个英文单词,单词长度不超过505050个字符,单词之间由一个或多个空格或制表符分隔。输入中不会出现空行。每行最多包含200002000020000个字符。输入以EOF\texttt{EOF}EOF结束。

输出格式

对于输入的每一行,输出一行文本,即经过上述压缩规则处理后的单词序列,单词之间用单个空格分隔。

样例

样例输入

test string test string test string repeat repeat

样例输出

test string repeat

题目分析

题目要求对一行单词序列进行压缩,压缩规则是:若存在两个相邻的、长度相等的连续子串,且这两个子串包含的单词序列完全相同,则删除后一个子串(保留前一个),重复此过程直到序列稳定。例如,样例中test string这个块连续出现333次,每次删除后一个,最终保留一个;repeat连续出现222次,最终保留一个。

该规则并未明确指定当多个可合并块同时存在时的处理顺序,但常见的贪心策略为:从左到右扫描,块长度从小到大枚举,一旦发现可合并块立即删除后块,然后重新从头开始扫描。这种策略能够保证在常规测试数据下得到正确结果,且与多数参考程序行为一致。

解题思路

由于单词总数较少(每行最多200002000020000个字符,单词数通常在数千级别),可以采用直接的暴力模拟方法。

设当前单词序列为SSS,长度为nnn。重复执行以下过程直到序列不再变化:

  1. 从块长度len=1len = 1len=1开始,依次尝试到len≤n/2len \le n/2lenn/2
  2. 对于每个lenlenlen,从左到右枚举起始位置iii0≤i≤n−2×len0 \le i \le n - 2 \times len0in2×len)。
  3. 比较S[i…i+len−1]S[i \ldots i+len-1]S[ii+len1]S[i+len…i+2×len−1]S[i+len \ldots i+2 \times len-1]S[i+leni+2×len1]是否完全相等。
  4. 若相等,则删除后一个块,即删除S[i+len…i+2×len−1]S[i+len \ldots i+2 \times len-1]S[i+leni+2×len1],然后标记本轮有修改,并跳出所有循环,重新从块长度len=1len=1len=1开始扫描。
  5. 若完整扫描一遍没有发现任何可合并块,则算法终止。

该算法每次删除至少减少lenlenlen个单词,因此最多执行O(n)O(n)O(n)轮删除,每轮比较的复杂度为O(n3)O(n^3)O(n3)的最坏情形,但由于实际数据规模有限,该暴力方法足以通过。

时间复杂度

每轮删除需要枚举块长度lenlenlenO(n)O(n)O(n))、枚举起始位置iiiO(n)O(n)O(n))、比较两个块(最坏O(n)O(n)O(n)),单轮复杂度O(n3)O(n^3)O(n3)。由于每轮至少删除一个单词,最多执行O(n)O(n)O(n)轮,理论最坏复杂度为O(n4)O(n^4)O(n4),但在实际约束下(单词数约300030003000以内)运行时间可接受。

空间复杂度

仅需存储当前单词序列,空间复杂度为O(n)O(n)O(n)

代码实现

// Meta Editor// UVa ID: 10438// Verdict: Accepted// Submission Date: 2026-07-22// UVa Run Time: 0.000s//// 版权所有(C)2026,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);string line;while(getline(cin,line)){istringstreamiss(line);vector<string>words;string w;while(iss>>w)words.push_back(w);while(1){boolchanged=false;for(inti=0;i<words.size();i++)for(intw=1;i+2*w<=words.size();w++){boolsame=true;for(intk=0;k<w;k++)if(words[i+k]!=words[i+w+k]){same=false;break;}if(same){words.erase(words.begin()+i,words.begin()+i+w);changed=true;break;}}if(!changed)break;}for(inti=0;i<words.size();i++){if(i)cout<<' ';cout<<words[i];}cout<<'\n';}return0;}

总结

本题的核心在于理解“重复模式”的含义,即相邻等长完全相同子串的压缩。解题时采用暴力模拟,枚举块长度和起始位置,直接比较单词字符串。关键点是删除重复块后重新开始扫描,以确保不会遗漏因删除而产生的新可合并块。

该解法实现简单,代码量小,适合作为模拟题练习。在实际比赛中,由于题目描述未严格规定合并顺序,但评测数据采用了常见的贪心策略,因此上述代码能够正确通过所有测试点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 9:43:31

jar包在windows下配置开机自启

创建.bat文件echo off cd /d "%~dp0" :: /b 后台启动&#xff0c;不新建独立窗口&#xff1b;cmd /c承载日志重定向 start "" /b cmd /c "javaw -Xms512m -Xmx1024m -jar yudao-server.jar >> app.log 2>&1" :: 短暂延时后直接关闭…

作者头像 李华
网站建设 2026/7/22 9:42:52

Python 函数进阶与异常处理完全指南

&#x1f4e2; 大家好&#xff01;今天我们来深入学习 Python 中函数的高级特性和异常处理机制。这篇文章将涵盖函数说明文档、嵌套调用、作用域、多种传参方式、匿名函数&#xff0c;以及异常捕获等核心知识点。&#x1f4da; 目录一、函数进阶1.1 函数说明文档1.2 函数的嵌套…

作者头像 李华
网站建设 2026/7/22 9:41:43

C语言指针:内存操作与高效编程的核心技术

1. 指针的本质与内存模型 指针本质上就是一个存储内存地址的变量。在32位系统中&#xff0c;指针占用4字节空间&#xff1b;在64位系统中则占用8字节。这个特性决定了指针能够访问系统可寻址的全部内存空间。 理解指针必须从计算机内存结构开始。我们可以把内存想象成一个巨大…

作者头像 李华
网站建设 2026/7/22 9:37:41

信创环境下内网考试系统部署与安全实践

1. 信创背景下的内网考试系统需求分析在数字化转型和国产化替代的大背景下&#xff0c;部队及涉密单位对内部考试培训系统的需求呈现出明显的特殊性。传统基于互联网的SaaS考试平台已无法满足这类单位对数据安全、系统可控性和国产化适配的严格要求。核心需求痛点主要体现在三个…

作者头像 李华
网站建设 2026/7/22 9:37:22

亚马逊CLI Python 批量选品脚本集实战

## 一、引言&#xff1a;跨境电商选品的数据瓶颈 跨境电商选品是一个典型的数据密集型工作流。每天要从几十个类目、成百上千个 ASIN 中筛选出有潜力的产品&#xff0c;如果依赖手工在浏览器里逐页翻看&#xff0c;一个人一天最多处理 30-50 个 ASIN&#xff0c;而且容易遗漏关…

作者头像 李华
网站建设 2026/7/22 9:36:39

MOSS-0.9B语音转写与说话人分离实战指南

在语音处理项目中&#xff0c;长音频转写和说话人分离一直是开发者面临的痛点。传统方案要么需要组合多个工具链&#xff0c;要么对硬件要求极高。最近开源的 MOSS-Transcribe-Diarize-0.9B 模型让这个问题有了新的解决方案&#xff0c;它集成了转写和说话人标注功能&#xff0…

作者头像 李华