CF631D Messenger (kmp + 字符串处理)

news/2024/7/4 8:39:47/文章来源:https://www.cnblogs.com/FireRaku/p/18277543

CF631D Messenger

kmp + 字符串处理

思路简单,写起来细节比较多

首先要合并同类项,然后再考虑什么时候 \(s=t\)。如果合并后 \(t\) 有一种或两种字符,那么都可以直接做;大于两种,我们发现匹配的条件为:中间部分完全相同,首尾字符相同并且 \(s\) 首尾字符的数量要大于 \(t\)

中间部分完全相同等价于字符和出现次数完全相同,所以我们只需要将这两个东西体现在字符串中,然后中间部分做 kmp 匹配,每当匹配到以后,判断两边是否满足条件即可。

复杂度 \(O(n)\)。我的实现不好,所以代码量又大,看上去又丑。

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define fi first
#define se second
#define pb push_backusing i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 1800010;
int n, m;
i64 ans;
i64 pretot, suftot;
char pre, suf, k;
std::string s, t;
i64 tot[N], id[N], nxt[N];
char c[200010];
char d[N];
int num;
int main() {std::cin >> n >> m;i64 lst = -1, lsttot = 0;for(int i = 1; i <= n; i++) {char a, b;std::cin >> tot[i] >> b >> a;if(lst == -1) lst = a, lsttot = tot[i];else if(lst == a) {lsttot += tot[i];} else {s += lst;char x[20];sprintf(x, "%lld", lsttot);s += x;c[++num] = lst;tot[num] = lsttot;lsttot = tot[i];lst = a;}}if(lst != -1) {s += lst;char x[12];sprintf(x, "%lld", lsttot);s += x;c[++num] = lst;tot[num] = lsttot;} //合并同类项s = "#" + s;int nw = 1, slen = s.length() - 1;for(int i = 1; i <= num; i++) {int j = nw;for(; j <= slen; j++) {if(s[j] >= 'a' && s[j] <= 'z' && s[nw] != s[j]) break;id[j] = i; d[j] = c[i];}nw = j;}int flg = 0;lst = -1, lsttot = 0;for(int i = 1; i <= m; i++) {char a, b;int v;std::cin >> v >> b >> a;if(lst == -1) lst = a, lsttot = v;else if(lst == a) {lsttot += v;} else {if(!flg) pre = lst, pretot = lsttot, flg++, lst = a, lsttot = v;else {t += lst;char x[20];sprintf(x, "%lld", lsttot);t += x;lsttot = v;lst = a;flg++;}}}if(lst != -1) {suf = lst, suftot = lsttot;flg++;} //合并同类项t = "#" + t;if(flg == 1) {pre = (pre | suf), pretot = (pretot | suftot);for(int i = 1; i <= num; i++) {if(c[i] == pre && tot[i] >= pretot) ans += 1LL * (tot[i] - pretot + 1);}std::cout << ans << "\n";return 0;} else if(flg == 2) {for(int i = 1; i < num; i++) {if(c[i] == pre && tot[i] >= pretot && c[i + 1] == suf && tot[i + 1] >= suftot) ans++;}std::cout << ans << "\n";return 0;} //特判int tlen = t.length() - 1;for(int i = 2, j = 0; i <= tlen; i++) {while(j && t[i] != t[j + 1]) j = nxt[j];if(t[i] == t[j + 1]) j++;nxt[i] = j;}for(int i = 1, j = 0; i <= slen; i++) {while(j && s[i] != t[j + 1]) j = nxt[j];if(s[i] == t[j + 1]) j++;if(j == tlen) {if(tot[id[i + 1]] >= suftot && d[i + 1] == suf) {if(tot[id[i - tlen]] >= pretot && d[i - tlen] == pre) ans++;} } } //普通情况std::cout << ans << "\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/735669.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[淘宝/天猫/1688/京东]API接口数据采集分享

主流电商平台大数据采集API接口。在当今时代,从数据中挖掘价值的重要性愈发凸显,远超以往任何时期。现代企业渴望在任意设备上,无论身处何地,都能实时获取最新的相关信息。这正是数字化转型的核心所在,它同样适用于供应链的每一个环节。在当今时代,从数据中挖掘价值的重要…

@RequestMapping中的name属性解释

在Spring MVC中,@RequestMapping注解用于映射web请求到特定的处理方法。这个注解有多个属性,其中之一就是name。name属性通常用于为映射提供一个名称,这个名称可以在日志、文档或其他需要引用这个映射的地方使用。 在Spring MVC的上下文中,这允许你为特定的@RequestMapping…

6种Win10关闭自动更新方法介绍!

Win10自动更新 想寻找Win10关闭自动更新方法?Windows 10自动更新功能旨在确保您的系统始终运行最新的安全补丁和功能更新。然而,对于某些用户来说,频繁的更新可能带来不便。有时选择拒绝更新,系统会一直不停的提示系统更新;选择更新了,更新后一些软件或网络打印机等相关设…

【动画进阶】类 ChatGpt 多行文本打字效果

今天我们来学习一个有意思的多行文本输入打字效果,像是这样:这个效果其实本身并非特别困难,实现的方式也很多,在本文中,我们更多的会聚焦于整个多行打字效果最后的动态光标的实现。 也就是如何在文本不断变长,在不确定行数的情况下,让文字的最末行右侧处,一直有一个不断…

解决卡顿发热,超帧技术焕发中重载游戏动力

近几年,中国手游市场规模不断扩大,开发者通过在画面、玩法等方面的持续创新和打磨,推出更加精品化的产品。然而愈发精美的画质和复杂的玩法,也给硬件带来超高的负载,导致玩家在游戏过程中,频繁出现掉帧卡顿、发烫、续航差等体验降低的现象。HarmonyOS SDK 图形加速服务(…

ArchiMate 3 学习

目录ArchiMate 3 学习什么是ArchiMateArchiMate 3.1 规范关系动机元素策略元素业务层应用层技术层物理元素实施和迁移元素复合元素 ArchiMate 3 学习 ArchiMate 3 中文版 什么是ArchiMate ArchiMate 是 The Open Group 为企业架构提供的开放和独立的建模语言,由不同的工具供应…

如何找到并快速上手一个开源项目

以前有写过两篇文章来简单聊过如何做开源的事情,最近我自己组了一个社区里面也有不少朋友对开源感兴趣,于是我便根据自己的经验系统的梳理了一些关于开源的事情。新手如何快速参与开源项目 手把手教你为开源项目贡献代码有兴趣的可以先看看之前这两篇。🔎如何找到自己感兴趣…

WPF在.NET9中的重大更新:Windows 11 主题

WPF在.NET9中的重大更新:Windows 11 主题在2023年的2月20日,在WPF的讨论区,WPF团队对路线的优先级发起了一次讨论。对三个事项发起了投票。 第一个是Windows 11 主题第二个是更新的控件第三个是可空性注释最终Windows 11 主题得票最高,WPF团队2023-2024的工作优先级就是Win…

配置 Swagger + 注释

打开Xml文件生成,右键项目进入属性设置: 取消未进行注释而进行提示的警告: 然后Program.cs增加代码: 代码:builder.Services.AddSwaggerGen(s => {//获取xml文件名称var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";//包含注释,…

C#winform如何在窗体实现视频播放

1.在Form窗体设计中的左侧工具箱列表中右击鼠标,单击选择项。2.在弹出的对话框中点击COM组件,选择Windows Media Player,点击确定3.接着在工具箱选择Windows Media Player控件,将控件添加到窗体中,并且添加一个OpenFileDialog控件4.接着在工具箱的对话框中将OpenFileDialog…

AI引导学习前端开发

假设你是一位前端技术开发专家,我有几个JavaScript的问题想向你咨询 我想用JavaScript来做微信小程序开发,请以表格的方式输出知识要点 请叙述JavaScript操作浏览器对象的常用接口和方法 把上述表格按照访问对象归类 将上述文字制作一个表格来呈现,要求逻辑清晰描述信息简明…

Codeforces Round 894 (Div. 3) A-E cd 894 div3

A. Gift Carpet 每道题都是伸缩代码框有ac代码请不要漏掉 --------------------------题解----------------------------- 按先行便然后列再变循环 设置jud每满足一个条件就让jud++ 只有jud==相应值的时候才让其++点击查看代码 #include<bits/stdc++.h> using namespace …

网络隔离后 用这种安全U盘可实现数据安全传输

在网络隔离的环境下,尤其是物理隔离环境下,使用安全U盘进行数据传输可以被视为一种安全的方法。不过前提是要确保以下几点: 1、来源可信性:确保U盘的来源是可信的,没有被感染或篡改过的风险。最好使用自己的U盘,或者来自于安全可靠的来源。 2、扫描病毒:在使用U盘之前,…

AI引到学习前端开发

假设你是一位前端技术开发专家,我有几个JavaScript的问题想向你咨询 我想用JavaScript来做微信小程序开发,请以表格的方式输出知识要点 请叙述JavaScript操作浏览器对象的常用接口和方法 把上述表格按照访问对象归类 将上述文字制作一个表格来呈现,要求逻辑清晰描述信息简明…

U-KAN环境搭建推理测试

​引子 U-Net的鼎鼎大名,我觉得无需我多言了。图像分割和扩散概率模型的基石。作者探索了KANs在改进视觉任务 Backbone 网络方面的未开发潜力。作者研究、修改并重新设计已建立的U-Net Pipeline ,通过在标记化的中间表示上整合专用的KAN层,称之为U-KAN。严格的医学图像分割基…

飞驰云联Ftrans数据安全摆渡系统有哪些优点?

数据安全摆渡系统通常是指一种专门设计用来在网络隔离环境下,安全传输数据的系统或服务,通常被那些需要在不同系统、网络或地理位置之间安全传输敏感数据的企业和组织广泛使用。以下是一些主要应用数据安全摆渡系统的企业类型: 金融服务机构:银行、证券公司、保险公司等需要…

关于 VuePress 的主题

什么是主题?读者对主题这个单词应该不陌生,例如大部分 APP 都支持白天主题和夜晚主题等,使用者可以很轻松的切换主题等等。VuePress 中也有类似的概念。什么是主题?读者对主题这个单词应该不陌生,例如大部分 APP 都支持白天主题和夜晚主题等,使用者可以很轻松的切换主题等…

中台框架模块开发实践-用 Admin.Core 代码生成器生成通用代码生成器的模块代码

之前分享中台 Admin.Core 的模块代码生成器,陆续也结合群友们的反馈,完善了一些功能和模板上的优化,而本篇将基于此代码生成器生成一个通用代码生成器模块的基本代码 后续再在此代码的基础上进行完善,制作一个通用的代码生成器前言之前分享中台 Admin.Core 的模块代码生成器…

Java助力加固Excel文件,保障数据安全

前言 Excel文件保护是常用的一种功能,文件保护主要有三种:添加密码,如果没有密码不允许打开文件。 添加密码,如果没有密码,不能修改文件,但可以打开,只读以及另存文件。 只读推荐,通常推荐打开Excel文件的用户使用只读模式打开,这种方式仅是一种提示,并非强行保护文件…