POJ1509 GlassBeads
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相关推荐
- 【POJ1509】Glass Beads 【后缀自动机】
题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...
- poj1509最小表示法
题意: 给你一个循环串,然后找到一个位置,使得从这个位置开始的整个串字典序最小. 思路: 最小表示法的建档应用,最小表示法很好理解,就点贪心的意思,一开始我们枚举两个起点i,j ...
- POJ1509 Glass Beads [后缀自动机]
题意: 给一个字符串S,每次可以将它的第一个字符移到最后面,求这样能得到的字典序最小的字符串.输出开始下标 练习SAM第一题! SS构造SAM,然后从开始尽量走最小走n步就可以啦 什么?开始位置?!R ...
- sqlserver查询当月的每一天_SQL生成一年每一天的时间列表的几种方法
工作好几年了,一直没有写博客,准备捡起来... 以下脚本适用环境:SQL SERVER (starting with 2012) 1.构建序列: /*1-1:利用交叉连接,推荐下列这种写法*/ SEL ...
- ZOJ 1729 Hidden Password
和POJ1509没什么区别,只是输入形式上有些许改变,而且这里要求输出的位置是字符串的 下标,而不用再加1. /*Accepted 1729 C++ 10ms 276kb Yu*/ #include& ...
- Competitive Programming 3题解
题目一览: Competitive Programming 3: The New Lower Bound of Programming Contests(1) Competitive Programm ...
- ICPC程序设计题解书籍系列之三:秋田拓哉:《挑战程序设计竞赛》(第2版)
白书<挑战程序设计竞赛>(第2版)题目一览 白书:秋田拓哉:<挑战程序设计竞赛>(第2版) 第1章 蓄势待发--准备篇(例题) POJ1852 UVa10714 ZOJ2376 ...
- ACM 训练大纲【CSUST_ACM】
来源:彪神发的训练文档 ACM 训练大纲 ...
- ACM 训练大纲(CSUST_ACM)
ACM 训练大纲 Changsha University of Science & Technology July 31, 2012 1 推荐题库 • http://ace.delos.com ...
最新文章
- log4j.xml如何配置
- 如何快速截取某段时间内的日志
- Microsoft Windows 7.0 build 7000 NAP测试--健康状态检测验证报告
- oracle创建多个游标,Oracle——游标的创建和使用
- Android 自动扫描歌曲,Android扫描本地音乐文件开发案例分享
- 鸿蒙电视是无线么,鸿蒙系统首秀,在自家设备上和普通电视大不相同赵崇带你走世界...
- Docker安装NextCloud使用MySQL
- linux命令学习之sar命令--服务器性能监测
- 浙大 博士 计算机视觉,95后浙大博士生开发全新视图合成系统Neural Body,稀疏视角输入即可合成360°人体视图|专访...
- 使用MediaRecorder录制音频和视频(Camera1)
- Kaldi中文语音识别:各种开源的已经训练好的语音识别模型
- 攻城狮还是产品运营?
- html站点根目在哪,10分钟了解Dreamweaver中站点根目录相对路径
- Unity 3D——打包复用资源(.unitypackage文件)
- 工欲善其事必先利其器-极客工具
- 英语单词记忆方法20种
- Open3d读写ply点云文件
- [SSM框架]—Mybatis入门
- 如何使用petri网建模工具pipe4.3.0
- 测试下1K个宏和程序运行空间大小的关系