当前位置: 首页 > news >正文

11.22 NOIP 模拟赛 T1. 破乱的诗歌

思路

场上考虑的其实很有道理来着

考虑左右字符集已经相同的情况是简单的
否则一定要把左右字符集调整到相同

那我们首先不难发现一个至少要使用的区间, 计算方法比较复杂, 但是宗旨是把左右字符集调整到相同且可匹配的必要花费
然后我们应该拓展长的那一端, 直到字符集相同之后可以考虑断开, 以此来获得最优解

#include <bits/stdc++.h>
#define int long long
#define rs rrt, mid + 1, r
#define mid ((l + r) >> 1)
#define ls lrt, l, mid
#define lrt rt << 1
#define rrt lrt | 1char s[1000005];
std::vector <int> pos[26];
int n, cnt[26], num[26], id[26];
int ans = 0, m;signed main () {scanf("%lld%s", &n, s + 1); m = (n + 1) / 2;for (int i = 1; i <= n; i++) cnt[s[i] - 'a']++;for (int i = 1; i <= n; i++) pos[s[i] - 'a'].push_back (i);int L = n / 2 + 1, R = m;memset (num, 0, sizeof num);for (int i = 1; i <= n / 2; i++) num[s[i] - 'a']++;for (int i = 0; i < 26; i++) if (num[i] > cnt[i] / 2)L = std::min (L, pos[i][cnt[i] / 2]);memset (num, 0, sizeof num);for (int i = n; i > m; i--) num[s[i] - 'a']++;for (int i = 0; i < 26; i++) if (num[i] > cnt[i] / 2)R = std::max (R, pos[i][cnt[i] / 2 - 1]);ans = R - L + 1;/*先换过来*/std::vector<int> chg1, chg2; chg1.clear(), chg2.clear();memset (num, 0, sizeof num);for (int i = 1; i <= n / 2; i++) num[s[i] - 'a']++;for (int i = 1; i <= n / 2; i++) if (num[s[i] - 'a'] > cnt[s[i] - 'a'] / 2) chg1.push_back(i), num[s[i] - 'a']--;memset (num, 0, sizeof num);for (int i = n; i > m; i--) num[s[i] - 'a']++;for (int i = n; i > m; i--) if (num[s[i] - 'a'] > cnt[s[i] - 'a'] / 2) chg2.push_back(i), num[s[i] - 'a']--;for (int i = 0; i < chg1.size(); i++) { int p1 = chg1[i], p2 = chg2[i]; std::swap(s[p1], s[p2]); }memset (num, 0, sizeof num);for (int i = 1; i <= n / 2; i++) num[s[i] - 'a']++;for (int i = n; i > m; i--) num[s[i] - 'a']--;int ccnt0 = 0;for (int i = 0; i < 26; i++) ccnt0 += (num[i] == 0);
//    std::cout << ccnt0 << ' ';if (R - m > n / 2 - L + 1) {
//        std::cout << "#1: ";int len = R - m;memset (num, 0, sizeof num);int cnt0 = 0;for (int i = m + 1; i <= R; i++) num[s[i] - 'a']++;for (int i = n / 2 - len + 1; i <= n / 2; i++) num[s[i] - 'a']--;for (int i = 0; i < 26; i++) cnt0 += (num[i] == 0);int l = n / 2 - len + 1, r = R;while (cnt0 != 26 && l > 1 && r < n) {l--, r++; if (s[l] != s[r]) {if (num[s[l] - 'a'] == 0) cnt0--;if (num[s[r] - 'a'] == 0) cnt0--;if (++num[s[l] - 'a'] == 0) cnt0++;if (--num[s[r] - 'a'] == 0) cnt0++;}ans++;}while (l > 1 && r < n) {l--, r++;if (s[l] != s[r]) {num[s[l] - 'a']++, num[s[r] - 'a']--; cnt0 = 24;ans++;while (cnt0 != 26 && l > 1 && r < n) {l--, r++; if (s[l] != s[r]) {if (num[s[l] - 'a'] == 0) cnt0--;if (num[s[r] - 'a'] == 0) cnt0--;if (++num[s[l] - 'a'] == 0) cnt0++;if (--num[s[r] - 'a'] == 0) cnt0++;}ans++;}}}printf("%lld", ans);} else {
//        std::cout << "#2: ";int len = n / 2 - L + 1;memset (num, 0, sizeof num);int cnt0 = 0;for (int i = m + 1; i <= m + len; i++) num[s[i] - 'a']--;for (int i = L; i <= n / 2; i++) num[s[i] - 'a']++;for (int i = 0; i < 26; i++) cnt0 += (num[i] == 0);int l = L, r = m + len;// std::cout << l << ' ' << r << '\n';while (cnt0 != 26 && l > 1 && r < n) {l--, r++; if (s[l] != s[r]) {if (num[s[l] - 'a'] == 0) cnt0--;if (num[s[r] - 'a'] == 0) cnt0--;if (++num[s[l] - 'a'] == 0) cnt0++;if (--num[s[r] - 'a'] == 0) cnt0++;}ans++;}while (l > 1 && r < n) {l--, r++;if (s[l] != s[r]) {num[s[l] - 'a']++, num[s[r] - 'a']--; cnt0 = 24;ans++;while (cnt0 != 26 && l > 1 && r < n) {l--, r++; if (s[l] != s[r]) {if (num[s[l] - 'a'] == 0) cnt0--;if (num[s[r] - 'a'] == 0) cnt0--;if (++num[s[l] - 'a'] == 0) cnt0++;if (--num[s[r] - 'a'] == 0) cnt0++;}ans++;}}}printf("%lld", ans);}return 0;
}

总结

你说的对, 但是码量真大吧

这个有点吃状态的

http://www.jsqmd.com/news/50528/

相关文章:

  • 莆田一对一家教辅导榜单更新:2025口碑最好的补习机构
  • 学习Linux需要买云服务器吗
  • 优化脚本
  • 黑白调E3 Pro:以超 300 项专利与顶尖人体工学,重塑玩家竞技体验
  • 漳州一对一辅导机构终极榜单:2025最新十大辅导机构实力排名
  • 广西一对一辅导机构终极评测:贺州、河池、来宾、崇左等地区2025补习机构权威评测优选
  • 2025 最新推荐!常州连接线线束厂家权威榜单:品控标准、定制能力与头部合作案例全景测评 LED / 电动工具 / 汽车零部件 / 家用电器电子连接线线束 / 汽车专用线束公司推荐
  • 篡改猴脚本失效解决办法
  • 2025 年打包带源头厂家最新推荐榜:ISO 认证 + 日产 20 吨级实力厂商,物流仓储优选权威榜单高亮打包带/塑钢打包带/PP 打包带/PET 打包带/纯新料打包带厂家推荐
  • MATLAB实现光谱数据预处理
  • 2025年5家美国绿卡申请专业机构深度评测!哪家最适合你?
  • 9 OpenCV中的形态学
  • 2025 年 11 月法兰绒面料厂家推荐排行榜,法兰绒布料,双面法兰绒,优质法兰绒面料,柔软保暖与高性价比之选
  • 告别稀疏发际线!2025值得入手的防脱洗发水推荐,根源防脱告别掉发
  • 用python实现简单的机器学习
  • 1125noip模拟赛
  • 2025 年 11 月珊瑚绒厂家推荐排行榜,珊瑚绒布料,珊瑚绒面料,珊瑚绒布,双面珊瑚绒,柔软亲肤保暖面料公司精选
  • 2025年学历提升、成人学历、专升本、自考本科、高起专服务机构综合评测与精选推荐
  • yymodel 某个属性当iOS以int接受 而接口返回null,json解析会崩溃不
  • 2025年穿线磁珠编带磁环制造企业权威推荐榜单:铁氧体磁环/非晶纳米晶磁环/磁环源头厂家精选
  • 2025年下半年新疆学历提升、成人学历、专升本、自考本科、高起专机构全面评测与选择指南
  • 2025年11月中国电线电缆厂家推荐榜单:权威评测与综合排名分析
  • AI搜索营销新蓝海:五家领先GEO服务商全景透视与战略布局指南
  • 2025年AI搜索时代五大GEO优化服务商全景解析:核心优势与行业适配指南
  • NOIP 模拟赛 9 比赛总结
  • 2025 最新信息平台推荐!工程项目、招投标、招采、政府采购信息查询平台口碑榜,覆盖拟在建项目精准对接服务
  • 2025年无纸化会议软件批发厂家权威推荐榜单:无纸化会议室/平板无纸化会议系统/无纸化升降器源头厂家精选
  • 构建文明的算法:价值原语化、三值纠缠与五维追问——一种AI元人文的实践框架
  • 规范驱动开发:AWS Kiro如何重塑AI编程新范式
  • 2025 最新兽药厂家权威推荐榜:技术专利 + 服务能力双维度测评,优质企业全解析