原题传送门

神奇的题目诶

原来以为字符串比较一定要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)相关推荐

  1. 洛谷P5594-【XR-4】模拟赛(模拟)

    题目描述: X 校正在进行 CSP 前的校内集训. 一共有 nnn 名 OIer 参与这次集训,教练为他们精心准备了 mmm 套模拟赛题. 然而,每名 OIer 都有各自的时间安排,巧合的是,他们在接 ...

  2. NOIP 2018模拟赛(模拟) 2018 11 3 A组 Day1 T1

    T1 铃仙的红色之瞳(eyes) 题目描述 为了方便你的预测,铃仙对该符卡进行了改造. 敌方非常强大,可以看作有无限的体力.通过该符卡,铃仙可以释放出子弹,敌方触碰到子弹就会损失一格体力.注意,每次敌 ...

  3. [2020.10.30NOIP模拟赛]字符串水题【SA,树状数组】

    正题 题目大意 一个字符串SSS. 若干个询问,每次询问一个串TTT和l,rl,rl,r.询问有多少个TTT和SSS的公共子串满足和为[l,r][l,r][l,r] 解题思路 考虑枚举子串左端,那么右 ...

  4. 20221005CSP-J2/S2模拟赛总结

    20221005CSP-J2/S2模拟赛总结 模拟链接 成绩 题解 感受 模拟链接 http://oi.hdoi.cn/training/12 成绩 420/600 2h10min 题解 [2017- ...

  5. 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了,拿 ...

  6. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  7. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  8. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  9. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  10. 第一届『Citric杯』NOIP提高组模拟赛 题解

    [官方题解]第一届『Citric杯』NOIP提高组模拟赛 题解 第一题 柠檬超市 这题是本次模拟赛的送分题.做法显然. 但是注意此题有一个陷阱: 注意W和C的规模都是10^9,所以如果直接用doubl ...

最新文章

  1. playbook核心元素之 -- 角色role(9)
  2. 华为Android9.0谷歌框架,华为Mate9怎样登陆谷歌商店 Mate9如何安装谷歌服务框架【详解】...
  3. 3分钟学会Linux管道符与重定向
  4. 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换
  5. 低版本Eclipse如何快速设置黑色主题
  6. linux 2.6.35 内核配置 usb,Linux 2.6.24.4移植到S3C2410(nano2410)之:USB
  7. Flutter AnimatedSwitcher 实现优美的图片切换动画
  8. 正式开始学习GO语言
  9. [Music]乡村摇滚:Any man of mine
  10. wordpress option.php,简单了解WordPress开发中update_option()函数的用法
  11. 蓝桥杯web:2.【Bug 调试】修复注册验证问题
  12. 测试开发(社招)面经:度小满
  13. 由于之前的错误,Context[]启动失败(SSM)
  14. LTE信令流程——位置更新
  15. SDL应用之三种字库
  16. 一般迭代法与steffensen迭代法matlab实现
  17. 何为集中式版本控制系统与分布式版本控制系统?
  18. 使用Java的讯飞语音识别示例
  19. jvm 垃圾回收器的并发与并行
  20. zigbee人员定位技术系统组成及自身特点

热门文章

  1. ASP.NET的ASHX一般处理程序中Session为null且不能赋值
  2. 北京大学生物信息学 (4)序列数据库
  3. 系统学习深度学习(三十一)--Nature DQN(NIPS 2015)
  4. TMS320C55x之C/C++语言程序设计
  5. android okhttp+解析json( okhttp 工具类)
  6. C语言:求矩阵对角线元素的和
  7. 学生教育云平台登录入口_学校安全教育平台登录入口
  8. presto安装及入门
  9. redis数据类型之set入门
  10. java单例设计及其在jdk中的应用