Hidden (NOIP模拟赛)(字符串模拟QAQ)
原题传送门
神奇的题目诶
原来以为字符串比较一定要O(NlogN)
结果发现可以均摊O(N)
首先我们来讲一讲原理
我们有3个指针i,j,k
i=0,j=1,k=0
一开始我们不断对k+1直到找到ch[i+k]!=ch[j+k]
那么我们进行判断 如果ch[i+k]>ch[j+k]
那么假设在ch[i]与ch[j]之前的字符串相同,而且我们已知ch[i+1]~ch[i+k-1]与ch[j+1]~ch[j+k-1]的字符串相同,
比较到ch[i+k]与ch[j+k]时,我们会发现ch[j+k]比ch[i+k]更优
所以以ch[i+1]~ch[i+k]为首的字符串一定不是最优解(因为ch[i+k]>ch[j+k]而前面的字符串相同)
所以我们更新i+=k+1;同理,如果ch[j+k]>ch[i+k],j+=k+1;
由于我们最终一定有一个指针超过总长N
所以输出i,j的最小值即可。
但是注意:本题有3个细节:
1、假若i与j重合,那么比较无法继续,所以if(i==j)j++;
2、每次更新指针后要清零重新开始判断
3、由于比较时有可能比较整个字符串,所以要将原字符串复制一遍
时间复杂度均摊O(n)
下面贴代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; char ch[10000001]; int ans=0,n; int work() {int i=0,j=1,k=0;while(i<n&&j<n){k=0;while(ch[i+k]==ch[j+k]&&k<n)k++;if(k==n)break;if(ch[i+k]>ch[j+k])i+=k+1; else j+=k+1;if(i==j)++j; }return min(i,j); } int main(){ // freopen("hidden.in","r",stdin); // freopen("hidden.out","w",stdout);scanf("%d",&n);scanf("\n");for(int i=0;i<n;i++){scanf("%c",&ch[i]);if((i+1)%72==0)scanf("\n"); }for(int i=n;i<=2*n-1;i++)ch[i]=ch[i-n];ans=work();printf("%d\n",ans); // fclose(stdin); // fclose(stdout); }
转载于:https://www.cnblogs.com/ghostfly233/p/6897532.html
Hidden (NOIP模拟赛)(字符串模拟QAQ)相关推荐
- 洛谷P5594-【XR-4】模拟赛(模拟)
题目描述: X 校正在进行 CSP 前的校内集训. 一共有 nnn 名 OIer 参与这次集训,教练为他们精心准备了 mmm 套模拟赛题. 然而,每名 OIer 都有各自的时间安排,巧合的是,他们在接 ...
- NOIP 2018模拟赛(模拟) 2018 11 3 A组 Day1 T1
T1 铃仙的红色之瞳(eyes) 题目描述 为了方便你的预测,铃仙对该符卡进行了改造. 敌方非常强大,可以看作有无限的体力.通过该符卡,铃仙可以释放出子弹,敌方触碰到子弹就会损失一格体力.注意,每次敌 ...
- [2020.10.30NOIP模拟赛]字符串水题【SA,树状数组】
正题 题目大意 一个字符串SSS. 若干个询问,每次询问一个串TTT和l,rl,rl,r.询问有多少个TTT和SSS的公共子串满足和为[l,r][l,r][l,r] 解题思路 考虑枚举子串左端,那么右 ...
- 20221005CSP-J2/S2模拟赛总结
20221005CSP-J2/S2模拟赛总结 模拟链接 成绩 题解 感受 模拟链接 http://oi.hdoi.cn/training/12 成绩 420/600 2h10min 题解 [2017- ...
- 2020.04.08【NOIP普及组】模拟赛C组24 总结
2020.04.08 2020.04.08 2020.04.08[ N O I P NOIP NOIP普及组]模拟赛 C C C组 24 24 24 总结 概述: 这次比赛我 A K AK AK了,拿 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 【noip模拟赛4】Matrix67的派对 暴力dfs
[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- jyzy noip模拟赛5.22-2
不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...
- 第一届『Citric杯』NOIP提高组模拟赛 题解
[官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...
最新文章
- playbook核心元素之 -- 角色role(9)
- 华为Android9.0谷歌框架,华为Mate9怎样登陆谷歌商店 Mate9如何安装谷歌服务框架【详解】...
- 3分钟学会Linux管道符与重定向
- 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换
- 低版本Eclipse如何快速设置黑色主题
- linux 2.6.35 内核配置 usb,Linux 2.6.24.4移植到S3C2410(nano2410)之:USB
- Flutter AnimatedSwitcher 实现优美的图片切换动画
- 正式开始学习GO语言
- [Music]乡村摇滚:Any man of mine
- wordpress option.php,简单了解WordPress开发中update_option()函数的用法
- 蓝桥杯web:2.【Bug 调试】修复注册验证问题
- 测试开发(社招)面经:度小满
- 由于之前的错误,Context[]启动失败(SSM)
- LTE信令流程——位置更新
- SDL应用之三种字库
- 一般迭代法与steffensen迭代法matlab实现
- 何为集中式版本控制系统与分布式版本控制系统?
- 使用Java的讯飞语音识别示例
- jvm 垃圾回收器的并发与并行
- zigbee人员定位技术系统组成及自身特点