Link

Difficulty

算法难度8,思维难度5,代码难度6

Description

给定一个串,你可以把开头字符放到结尾,这个操作可以执行任意次

求使得最终串字典序最小的起点在哪个位置

多组询问,单组长度不超过100001000010000

Solution

把字符串复制一遍接在后面,然后建SAM

从根节点开始走,每次走可以走的最小边,走n步到达的点就是答案

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
inline int read(){int x=0,f=1;char ch=' ';while(ch<'0' || ch>'9'){if(ch=='0')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return f==1?x:-x;
}
const int N=1e5+5;
namespace SAM{int last,cnt;int ch[N][26],l[N],fa[N];inline void insert(int c){int p=last,np=++cnt;last=np;l[np]=l[p]+1;for(;p && !ch[p][c];p=fa[p])ch[p][c]=np;if(!p)fa[np]=1;else{int q=ch[p][c];if(l[q]==l[p]+1)fa[np]=q;else{int nq=++cnt;l[nq]=l[p]+1;memcpy(ch[nq],ch[q],sizeof ch[nq]);fa[nq]=fa[q];fa[q]=fa[np]=nq;for(;ch[p][c]==q;p=fa[p])ch[p][c]=nq;}}}inline void init(){for(int i=1;i<=cnt;++i){l[i]=fa[i]=0;memset(ch[i],0,sizeof ch[i]);}last=cnt=1;}
};
int T,n;
char ch[N];
int main(){T=read();while(T--){memset(ch,0,sizeof ch);SAM::init();scanf("%s",ch+1);n=strlen(ch+1);for(int i=1;i<=n;++i)SAM::insert(ch[i]-'a');for(int i=1;i<=n;++i)SAM::insert(ch[i]-'a');int now=1;for(int i=1;i<=n;++i)for(int k=0;k<26;++k)if(SAM::ch[now][k]){now=SAM::ch[now][k];break;}printf("%d\n",SAM::l[now]-n+1);}return 0;
}

POJ1509 GlassBeads相关推荐

  1. 【POJ1509】Glass Beads 【后缀自动机】

    题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...

  2. poj1509最小表示法

    题意:       给你一个循环串,然后找到一个位置,使得从这个位置开始的整个串字典序最小. 思路:       最小表示法的建档应用,最小表示法很好理解,就点贪心的意思,一开始我们枚举两个起点i,j ...

  3. POJ1509 Glass Beads [后缀自动机]

    题意: 给一个字符串S,每次可以将它的第一个字符移到最后面,求这样能得到的字典序最小的字符串.输出开始下标 练习SAM第一题! SS构造SAM,然后从开始尽量走最小走n步就可以啦 什么?开始位置?!R ...

  4. sqlserver查询当月的每一天_SQL生成一年每一天的时间列表的几种方法

    工作好几年了,一直没有写博客,准备捡起来... 以下脚本适用环境:SQL SERVER (starting with 2012) 1.构建序列: /*1-1:利用交叉连接,推荐下列这种写法*/ SEL ...

  5. ZOJ 1729 Hidden Password

    和POJ1509没什么区别,只是输入形式上有些许改变,而且这里要求输出的位置是字符串的 下标,而不用再加1. /*Accepted 1729 C++ 10ms 276kb Yu*/ #include& ...

  6. Competitive Programming 3题解

    题目一览: Competitive Programming 3: The New Lower Bound of Programming Contests(1) Competitive Programm ...

  7. ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)

    白书<挑战程序设计竞赛>(第2版)题目一览 白书:秋田拓哉:<挑战程序设计竞赛>(第2版) 第1章 蓄势待发--准备篇(例题) POJ1852 UVa10714 ZOJ2376 ...

  8. ACM 训练大纲【CSUST_ACM】

    来源:彪神发的训练文档                                                                      ACM 训练大纲           ...

  9. ACM 训练大纲(CSUST_ACM)

    ACM 训练大纲 Changsha University of Science & Technology July 31, 2012 1 推荐题库 • http://ace.delos.com ...

最新文章

  1. log4j.xml如何配置
  2. 如何快速截取某段时间内的日志
  3. Microsoft Windows 7.0 build 7000 NAP测试--健康状态检测验证报告
  4. oracle创建多个游标,Oracle——游标的创建和使用
  5. Android 自动扫描歌曲,Android扫描本地音乐文件开发案例分享
  6. 鸿蒙电视是无线么,鸿蒙系统首秀,在自家设备上和普通电视大不相同赵崇带你走世界...
  7. Docker安装NextCloud使用MySQL
  8. linux命令学习之sar命令--服务器性能监测
  9. 浙大 博士 计算机视觉,95后浙大博士生开发全新视图合成系统Neural Body,稀疏视角输入即可合成360°人体视图|专访...
  10. 使用MediaRecorder录制音频和视频(Camera1)
  11. Kaldi中文语音识别:各种开源的已经训练好的语音识别模型
  12. 攻城狮还是产品运营?
  13. html站点根目在哪,10分钟了解Dreamweaver中站点根目录相对路径
  14. Unity 3D——打包复用资源(.unitypackage文件)
  15. 工欲善其事必先利其器-极客工具
  16. 英语单词记忆方法20种
  17. Open3d读写ply点云文件
  18. [SSM框架]—Mybatis入门
  19. 如何使用petri网建模工具pipe4.3.0
  20. 测试下1K个宏和程序运行空间大小的关系

热门文章

  1. Windows7上安装TensorFlow的GPU版本后记
  2. 星际之门(一)(nyoj 127)
  3. JS的游戏-打字机-时钟-随机方块-计算器-摇色子
  4. C#_Word详细解析
  5. 详解 Java 17 中新推出的密封类
  6. More Effective C++ Item 附2:一个auto_ptr的实现实例
  7. java 熔断_Hystrix进行熔断降级
  8. Salesforce 动态审批
  9. LR和GBDT模型训练
  10. DAG的algorithm