原题传送门

神奇的题目诶

原来以为字符串比较一定要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[];
int ans=,n;
int work()
{
int i=,j=,k=;
while(i<n&&j<n)
{
k=;
while(ch[i+k]==ch[j+k]&&k<n)k++;
if(k==n)break;
if(ch[i+k]>ch[j+k])i+=k+; else j+=k+;
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=;i<n;i++)
{
scanf("%c",&ch[i]);
if((i+)%==)scanf("\n");
}
for(int i=n;i<=*n-;i++)
ch[i]=ch[i-n];
ans=work();
printf("%d\n",ans);
// fclose(stdin);
// fclose(stdout);
}

Hidden (NOIP模拟赛)(字符串模拟QAQ)的更多相关文章

  1. 6.18 省选模拟赛 字符串 LCT SAM

    LINK:字符串 看起来很难做 考虑一种暴力 建立SAM后每次查询暴力扫儿子. 期望得分10分.实际得分10分. 另外一种发现每次扫儿子过于暴力 可以每次儿子向上做贡献 每次都暴力向上跳. 期望得分1 ...

  2. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

  3. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  4. NOIP模拟赛-2018.11.5

    NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...

  5. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

  6. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  7. NOIP前模拟赛总结

    NOIP前模拟赛总结 from 2018.10.7 to ??? Date Name Score(Rank) Problems 2018.10.7 McfXH AK Contest 42(?) 期望得 ...

  8. NOIP模拟赛 6.29

    2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...

  9. 2018.12.30【NOIP提高组】模拟赛C组总结

    2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...

  10. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

随机推荐

  1. linux基础命令3(man)

    Type:显示指定的命令是那种类型.                                            Linux下有两种模式的时间 date:用于系统时间管理.(软件操作的系统时 ...

  2. C++基础 const

    1. C中的const C中const变量只是只读变量,有自己存储空间.可能被存放在 栈.堆.数据段,所以可以修改. 2. C++中const 可能分配空间,也可能不分配空间. 当 const 为全局 ...

  3. POJ:2100-Graveyard Design(尺取)

    Graveyard Design Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 8504 Accepted: 2126 Cas ...

  4. 初见spark-01

    今天我们来学习spark,spark是一种快速,通用,可扩展的大数据分析引擎,现已成为Apache顶级项目,Spark是MapReduce的替代方案,而且兼容HDFS,Hive,可融入Hadoop的生 ...

  5. Android面试收集录12 View测量、布局及绘制原理

    一.View绘制的流程框架 View的绘制是从上往下一层层迭代下来的.DecorView-->ViewGroup(--->ViewGroup)-->View ,按照这个流程从上往下, ...

  6. Quartus 11进行编译Compile Design的时候出现错误near text ã

    1. 设计的工程在Compile Design的时候出现以下的错误,百思不得姐 Error (): Verilog HDL syntax error at div_5.v() near text ã ...

  7. web开发学习之路是否有尽头

    Linux/Git/Pip/Npm/Composer Apache/Ngnix Mysql/MongoDb/Redis PHP/Python/NodeJS javascript/jQuery/Expr ...

  8. Activiti入门 -- 轻松解读数据库

    相关文章: <史上最权威的Activiti框架学习指南> <Activiti入门 --环境搭建和核心API简介> 在Activiti中,相对前身JBPM基础上又额外多了5张,框 ...

  9. Pascal小游戏之奇葩的RPG

    Pascal吧友作品 一个小RPG Chaobs转载 varplife,plifemax,patt,pre:integer;gr,ex,exmax:integer;alife,alife1,aatt, ...

  10. Cannot create a secure XMLInputFactory --CXF调用出错

    在调用方法前加上下面三句即可调用成功: Properties props = System.getProperties(); props.setProperty("org.apache.cx ...