题解:P3590 [POI 2015] TRZ

news/2025/2/1 12:33:03/文章来源:https://www.cnblogs.com/naroto2022/p/18696243

P3590 题解

题面

原题传送门

思路

由于这个帖子没有人给出 hack,所以我就照着这个思路开始证明。

结论:最终答案的左端点在 \(1\sim3\) 的位置之一或者右端点在 \(n-2\sim n\) 的位置之一。

假设目前的字符串 a1 a2 a3 res a4 a5 a6,其中 \(res\) 为当前的最优解。

  1. \(res\) 中只有一个字符 \(ch\),则有两种情况。
    1. \(|ch|=1\),则 \(res\) 可以在 \(a_{1\sim6}\) 里任意一个,所以满足结论。
    2. \(|ch|>1\),则单独考虑 res a4,若 \(a_4=ch\),则 \(res\) 可以扩展;若 \(a_4\neq ch\),则 \(|a_4|=1\),此时 \(|a_4|\neq|ch|\),所以在这种情况下,结论成立。
  2. \(res\) 中有多个字符,那么这三个字符的出现次数不一样,不妨设 \(|B|>|C|>|S|\),则又有三种情况。
    1. \(a_3=\) B\(a_4=\) B,则 \(res\) 可以继续往外扩展。
    2. \(a_3=\) C\(a_4=\) C,设 \(a_4=\) C,若 \(res\) 可以扩展到 \(a_4\),则满足结论;若不能扩展到 \(a_4\),则有 \(|B|=|C|+1\),接下来考虑扩展 \(a_3,a_5\),若 \(a_3,a_5\) 中有一个为 BC,则可以扩展;若 \(a_3,a_5=\) S,于是考虑 a3 resS res,若 \(res\) 可以扩展到 \(a_3\),则满足结论;若不能扩展,则有 \(|C|=|S|+1\),于是联立下前面的式子,\(res\) 里字母数量满足 \(|B|=|C|+1=|S|+2\)。继续讨论,若 \(a_2=\) B,则 a2 a3 res a4B S res C 满足题意;若 \(a_2=\) C,则 a2 a3 res a4C S res C 满足题意;若 \(a_2=\) S,继续讨论 \(a_1\),若 \(a_1=\) B,则 a1 a2 a3 resB S S res 满足题意;若 \(a_1=\) S,则 a1 a2 a3 resS S S res 满足题意;若 \(a_1=\) C,继续讨论 \(a_6\),若 \(a_6=\) B,则 res a4 a5 a6res C S B 满足题意;若 \(a_6=\) C,则 res a4 a5 a6res C S C 满足题意;若 \(a_6=\) S,则 a1 a2 a3 res a4 a5 a6C S S res C S S 满足题意。综上所述,当 \(a_4=\) C 时,\(res\) 可以扩展。
    3. \(a_3,a_4=\) S(一个为 S 的情况上面已经讨论),若 a3 resa3 res a4 都不能扩展,则有 \(|B|=|C|+1=|S|+2\),接下来考虑 \(a_2,a_5\),若 \(a_2,a_5=\) B,则 a2 a3 res a4C S res S 满足题意,\(a_5\) 同理也满足题意;若 \(a_2,a_5=\) S,则 a2 a3 res a4S S res S 满足题意,\(a_5\) 同理也满足题意;若 \(a_2,a_5=\) C,继续考虑 \(a_1,a_6\),若 \(a_1,a_6=\) B,则 a1 a2 a3 resB C S res 满足题意,\(a_6\) 同理也满足题意;若 \(a_1,a_6=\) C,则 a1 a2 a3 resC C S res 满足题意,\(a_6\) 同理也满足题意;若 \(a_1,a_6=\) S,则 a1 a2 a3 res a4 a5 a6S C S res S C 满足题意,\(a_6\) 同理也满足题意。综上所述,\(a_3,a_4=\) S 时,\(res\) 可以扩展。

证毕,所以只要用前缀和记录下字符串字母出现的次数,一个个判断过去即可,时间复杂度为 \(O(n)\)

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int MN=1e6+5;
ll n,s[MN][3],ans=1;
char c[MN];
void write(ll n){if(n<0){putchar('-');write(-n);return;}if(n>9)write(n/10);putchar(n%10+'0');}
ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
char gc(){char ch=getchar();while(ch!='B'&&ch!='C'&&ch!='S')ch=getchar();return ch;}
ll gs(char ch){if(ch=='C') return 0;if(ch=='B') return 1;return 2;}
int main(){n=read();for(int i=1; i<=n; i++){c[i]=gc();s[i][gs(c[i])]++;}for(int i=1; i<=n; i++) for(int j=0; j<3; j++) s[i][j]+=s[i-1][j];for(int i=1; i<=3; i++) for(int j=n; j>i; j--) if((s[j][0]-s[i-1][0]!=s[j][1]-s[i-1][1]&&s[j][1]-s[i-1][1]!=s[j][2]-s[i-1][2]&&s[j][0]-s[i-1][0]!=s[j][2]-s[i-1][2])||(s[j][0]-s[i-1][0]+s[j][1]-s[i-1][1]+s[j][2]-s[i-1][2]==s[j][0]-s[i-1][0])||(s[j][0]-s[i-1][0]+s[j][1]-s[i-1][1]+s[j][2]-s[i-1][2]==s[j][1]-s[i-1][1])||(s[j][0]-s[i-1][0]+s[j][1]-s[i-1][1]+s[j][2]-s[i-1][2]==s[j][2]-s[i-1][2])) ans=max(ans,(ll)j-i+1);for(int j=n; j>n-3; j--) for(int i=1; i<j; i++) if((s[j][0]-s[i-1][0]!=s[j][1]-s[i-1][1]&&s[j][1]-s[i-1][1]!=s[j][2]-s[i-1][2]&&s[j][0]-s[i-1][0]!=s[j][2]-s[i-1][2])||(s[j][0]-s[i-1][0]+s[j][1]-s[i-1][1]+s[j][2]-s[i-1][2]==s[j][0]-s[i-1][0])||(s[j][0]-s[i-1][0]+s[j][1]-s[i-1][1]+s[j][2]-s[i-1][2]==s[j][1]-s[i-1][1])||(s[j][0]-s[i-1][0]+s[j][1]-s[i-1][1]+s[j][2]-s[i-1][2]==s[j][2]-s[i-1][2])) ans=max(ans,(ll)j-i+1);write(ans);putchar('\n');return 0;
}

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

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

相关文章

java中的HsahMap

HsahMap HashMap 是 Java 中最常用的集合类之一,它实现了 Map 接口,基于哈希表存储键值对 HashMap的存储是无顺序的 HashMap存储的是键值对(key-value)其中键key是唯一的,值(value)可以重复。 HashMap的底层是数组和链表 HashMap的常见方法 添加方法: 1,put(K key, V valu…

MyBatis的增删改查实现

首先还是使用上一篇文章相同的数据表和实体类,如下图所示1 package com.loubin.pojo;2 3 public class User {4 private int id;5 private String name;6 private String pwd;7 8 public int getId() {9 return id; 10 } 11 12 public void …

Reqable:现代化 API 调试工具

Reqable 是一款专为开发者设计的现代化 API 调试工具,旨在简化 API 开发、测试和调试的流程。 它支持多种协议(如 HTTP、HTTPS、WebSocket 等),并提供了丰富的功能,帮助开发者更高效地构建、调试和分析 API 请求与响应。 Reqable 以其简洁的设计、强大的功能和卓越的性能,…

DeepSeek-R1?别信新闻,它真能打败 OpenAI?

Yy DeepSeek-R1?别信新闻 它真的是那个打败 OpenAI 的开源黑马模型,还是又一条假新闻? Fabio Matricardi它真的那么厉害……是在哪方面? 前言:DeepSeek在大模型小型以及优化的道路上探索蒸馏和纯强化学习的路径获得的一点成绩确实让美国人紧张了一把,但同时也招致了更严格…

6.演讲比赛流程管理系统

基于STL的演讲比赛流程管理系统。1.需求2.文件目录3.代码 3.1Speaker.h #pragma once #include<iostream> using namespace std;class Speaker {public:string m_Name;double m_Score[2];};3.2SpeechManager.h #pragma once #include<iostream> #include<vector…

Qwen2.5-VL:更强大的多模态大模型|附实测结果

模型更新简述 几天前,通义千问更新了最新的多模态大模型Qwen2.5-VL,拥有包含 3B、7B 和 72B 在内的 3 个模型尺寸,同时完全开源,可在huggingface和modelscope下载到所有模型权重。 1. 更灵活的时空维度处理 ● 空间维度上,动态地将不同尺寸的图像转换为不同长度的token,并…

第五节上,图像分类实战,食物分类

随机种子固定随机结果,方便复现 def seed_everything(seed):torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)torch.backends.cudnn.benchmark = Falsetorch.backends.cudnn.deterministic = Truerandom.seed(seed)np.random.seed(seed)o…

对比使用DeepSeek与文新一言,了解DeepSeek的关键技术论文

DeepSeek是国内大模型技术的新秀,最近也在业界和媒体界火爆出圈,所以想学习一下其技术。 大模型时代,学习知识,当然首先想到利用大模型,由于在过去一年,对DeepSeek使用不多,所以想和文新一言(4.0 Turbo)对比使用。 通过对比,针对同一个问题“DeepSeek发扬开源文化,将…

Cisco NX-OS Software Release 10.5(2)F - 网络操作系统软件

Cisco NX-OS Software Release 10.5(2)F - 网络操作系统软件Cisco NX-OS Software Release 10.5(2)F - 网络操作系统软件 NX-OS 网络操作系统 请访问原文链接:https://sysin.org/blog/cisco-nx-os-10/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgCisco NX-OS…

pdf处理--tts(待重写)

1.提取正文2.裁剪页眉 https://smallpdf.com/cn/crop-pdf#r=crop-pages3.拆分4.ocr 效果图--白描:效果图--4Videosoft PDF Converter Ultimate:5.阅读器与tts引擎 开源阅读:https://github.com/gedoor/legado tts-server-android:https://github.com/jing332/tts-server-an…

INFINI Labs 产品更新 | Console 发布 TopN 功能,Easysearch 新增 Rollup 能力等

INFINI Labs 产品全新发布!此次更新为大家带来了 Console 的全新 TopN 功能,让您能够更高效地定位最关键的节点或索引;Easysearch 新增 Rollup 能力,大幅提升监控指标的存储周期并优化分析体验;此外,Framework 还修复了多项缺陷并进行了多处优化。欢迎下载体验,探索更多…

03-一个例子

登录被测系统bysms双击运行runserver.bat 访问页面:http://127.0.0.1/mgr/sign.html 账号:byhy,密码:88888888 可以直接在pycharm的Terminal中运行hytest,不需要打开命令行窗口 浏览器驱动的打印信息: 禁止 chromedriver 日志写屏1 from selenium import webdriver 2 3 …