题目链接:http://poj.org/problem?id=1509

题目意思就是求循环字符串的最小表示。

我们用字符串S+S建立SAM,然后从root开始走n步,每次尽量选最小的。

由于 SAM 可以接受 SS 所有的子串,而字典序最小的字符串也必定是 SS 的子串,因此按照上面的规则移动就可以找到一个字典序最小的子串。

这里的right等价类的len显然可以直接扩展到串首,于是开始的位置就是T[o].len-n+1。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct State{
int ch[],fa,len;
void init(){
fa=-;
len=;
memset(ch,-,sizeof(ch));
}
}T[];
char s[];
int cnt=,la;
void Extend(int c){
int end=++cnt,tmp=la;
T[end].init();
T[end].len=T[tmp].len+;
while(tmp!=-&&T[tmp].ch[c]==-){
T[tmp].ch[c]=end;
tmp=T[tmp].fa;
}
if(!~tmp) T[end].fa=;
else{
int ne=T[tmp].ch[c];
if(T[tmp].len+==T[ne].len) T[end].fa=ne;
else{
int np=++cnt;
T[np].init();
T[np]=T[ne];
T[np].len=T[tmp].len+;
T[end].fa=T[ne].fa=np;
while(tmp!=-&&T[tmp].ch[c]==ne){
T[tmp].ch[c]=np;
tmp=T[tmp].fa;
}
}
}
la=end;
}
int main(){
int Test;
scanf("%d",&Test);
while(Test--){
cnt=;
la=;
T[].init();
scanf("%s",s);
int n=strlen(s);
for(int i=;i<n;i++) Extend(s[i]-'a');
for(int i=;i<n;i++) Extend(s[i]-'a');
int o=;
for(int i=;i<n;i++)
for(int j=;j<;j++)
if(~T[o].ch[j]){
o=T[o].ch[j];
break;
}
printf("%d\n",T[o].len-n+);
}
return ;
}

[POJ1509]Glass Beads 后缀自动机 最小循环串的更多相关文章

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

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

  2. POJ 1509 Glass Beads 后缀自动机 模板 字符串的最小表示

    http://poj.org/problem?id=1509 后缀自动机其实就是一个压缩储存空间时间(对节点重复利用)的储存所有一个字符串所有子串的trie树,如果想不起来长什么样子可以百度一下找个图 ...

  3. POJ1509 Glass Beads(最小表示法 后缀自动机)

    Time Limit: 3000MS   Memory Limit: 10000K Total Submissions: 4901   Accepted: 2765 Description Once ...

  4. 【后缀自动机】poj1509 Glass Beads

    字符串最小表示 后缀自动机 O(n) 把串复制一次,链接在后面之后,建立SAM,贪心地在SAM上转移,每次贪心地选择最小的字符,转移的长度为n时停止. 输出时由于要最靠前的,所以要在endpos集合中 ...

  5. POJ1509 Glass Beads

    Glass Beads Time Limit: 3000MS   Memory Limit: 10000K Total Submissions: 4314   Accepted: 2448 Descr ...

  6. BZOJ 2882 工艺 ——后缀自动机 最小表示法

    先说后缀自动机的做法. 直接把S串复制一遍成SS,然后建立后缀自动机,go边相当于在当前字符的后面插入,而son边可以看作在字符串前面加一个字符. 所以贪心的走字典序最小的边即可,而且根据后缀自动机的 ...

  7. SPOJ LCS2 - Longest Common Substring II 后缀自动机 多个串的LCS

    LCS2 - Longest Common Substring II no tags  A string is finite sequence of characters over a non-emp ...

  8. [SPOJ1812]Longest Common Substring II 后缀自动机 多个串的最长公共子串

    题目链接:http://www.spoj.com/problems/LCS2/ 其实两个串的LCS会了,多个串的LCS也就差不多了. 我们先用一个串建立后缀自动机,然后其它的串在上面跑.跑的时候算出每 ...

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

    题目分析: 模板练手.看最长能走多远. 代码: #include<iostream> #include<cstdio> #include<cstdlib> #inc ...

随机推荐

  1. 那条linq语句为啥这么慢

    目前所在的项目大量使用了linq,结果有个地方出现了严重的性能问题.一个统计需要3.40秒.头头焦头烂额之际,也让我看看. 我向来喜欢性能调优,自诩编码极为注重性能.曾几何时,也动不动就把性能挂在嘴边 ...

  2. pymssql.connect(server='.', user='', password='', database='', timeout=0, login_timeout=60, charset='UTF-8', as_dict=False, host='', appname=None, port='1433', conn_properties, autocommit=False, tds_

    http://pymssql.org/en/stable/ref/pymssql.html """ This is an effort to convert the py ...

  3. Using Python with TurboGears A complete web framework integrating several Python projects

    Using Python with TurboGears TurboGears is a Python web framework based on the ObjectDispatch paradi ...

  4. Datatables 1.10.x在命名上与1.9.x

    1.10.x与1.9.x参数名对照表 Datatables 1.10.x在命名上与1.9.x的有区别,新版的使用的是驼峰的命名规则,而之前的是采用匈牙利命名规则 当然,这些变化都是向下兼容的,你可以继 ...

  5. Codeforces Round #261 (Div. 2)——Pashmak and Graph

    题目链接 题意: n个点.m个边的有向图.每条边有一个权值,求一条最长的路径,使得路径上边值严格递增.输出路径长度 )) 分析: 由于路径上会有反复点,而边不会反复.所以最開始想的是以边为状态进行DP ...

  6. I.MX6 mkuserimg.sh hacking

    /*********************************************************************** * I.MX6 mkuserimg.sh hackin ...

  7. 2.jeesite增删改查

    一.准备数据 在数据库中中添加一张表和数据,以mysql为例 SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------- ...

  8. Swift4 可选型, 可失败的构造函数

    创建: 2018/02/25 完成: 2018/02/26 更新: 补充类内可选型属性不初始化自动设为nil [任务表]TODO  可选型  可选型与nil 可选型声明方法 var 属性: 类型? / ...

  9. ThinkPHP3.2.3学习笔记3---视图

    一.说明 每个模块的模板文件是独立的,为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:视图目录/[模板主题/]控制器名/操作名+模板后缀 默认的视图目录 ...

  10. bzoj 1612: [Usaco2008 Jan]Cow Contest奶牛的比赛【Floyd】

    floyd传递关系,一个牛能确定排名的条件是能和所有牛确定关系 #include<iostream> #include<cstdio> using namespace std; ...