题意

给出一个字符串,求它的最小表示法。

分析

这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭!

我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的时候就停下。如果停下的那个状态时u,那么ans=st[u].len-n+1

  

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map> using namespace std;
const int maxn=+;
char s[maxn];
int n,T;
struct state{
map<char,int>next;
int len,link;
}st[*maxn];
int last,cnt,cur;
void init(){
last=cur=;
cnt=;
st[].len=;
st[].link=-;
st[].next.clear();
}
void build(char c){
cur=cnt++;
st[cur].next.clear();
st[cur].len=st[last].len+;
int p;
for(p=last;p!=-&&!st[p].next.count(c);p=st[p].link)
st[p].next[c]=cur;
if(p==-)
st[cur].link=;
else{
int q=st[p].next[c];
if(st[p].len+==st[q].len)
st[cur].link=q;
else{
int clone=cnt++;
st[clone].next=st[q].next;
st[clone].link=st[q].link;
st[clone].len=st[p].len+;
for(;p!=-&&st [p].next[c]==q;p=st[p].link)
st[p].next[c]=clone;
st[q].link=clone;st[cur].link=clone;
}
}
last=cur;
}
int main(){
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%s",s);
n=strlen(s);
for(int i=;i<n;i++)
s[i+n]=s[i];
init();
for(int i=;i<n;i++)
build(s[i]);
for(int i=n;i<*n;i++)
build(s[i]);
int u=;
for(int i=;i<n;i++){
for(int j='a';j<='z';j++){
if(st[u].next.count(j)){
u=st[u].next[j];
break;
}
}
}
int ans=st[u].len-n+;
printf("%d\n",ans);
}
return ;
}

【POJ1509】Glass Beads 【后缀自动机】的更多相关文章

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

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

  2. [POJ1509]Glass Beads 后缀自动机 最小循环串

    题目链接:http://poj.org/problem?id=1509 题目意思就是求循环字符串的最小表示. 我们用字符串S+S建立SAM,然后从root开始走n步,每次尽量选最小的. 由于 SAM ...

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

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

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

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

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

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

  6. POJ1509 Glass Beads

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

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

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

  8. [poj1509]Glass Beads(最小表示法)

    题目大意:求循环同构的字符串的最小字典序. 解题关键:最小表示法模板题. #include<cstdio> #include<cstring> #include<algo ...

  9. UVA 719 / POJ 1509 Glass Beads (最小表示法/后缀自动机)

    题目大意: 给出一个长度为N的字符串,求其字典序最小的循环同构. N<=10W. 算法讨论: 算法一.最小表示法.定义题. 算法二.后缀自动机. Codes: #include <iost ...

随机推荐

  1. sentry docker-compsoe 安装以及简单使用

    1. 准备环境 docker docker-compose     2. 安装 a. docker-compose git clone git clone https://github.com/get ...

  2. 使用实例 ---- 使用NUnit在.Net编程中进行单元测试

    [---  资料是从免费网站上获取的,上载在这里,只为交流学习目的,文章原作者保留所有权力,如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除.同时本人深表歉意,并致以崇高的谢意!e ...

  3. 【转】HP laserjet p2055dn的自动双面打印功能

    原文网址:http://zhidao.baidu.com/link?url=n_NW7Qfa_7HlrEhLucdvKO43jj3SpFXJhGAfQ-WqF979jm80eUv8s1atqtxE7w ...

  4. Eclipse的maven工具

    左侧是组件以及组件依赖树(层级结构):右侧是识别出来的所有的组件:  

  5. apache编译参数详解

    常用编译参数: ./configure     //配置源代码树–prefix=/usr/local/apache    //体系无关文件的顶级安装目录PREFIX ,也就Apache的安装目录.–e ...

  6. 读取设置config.ini配置

    class CSenseIni { /************************************************************************/ /*写操作 * ...

  7. java的时间

    先看例子: import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...

  8. C++直接初始化和复制初始化1

    这篇文章主要介绍了C++直接初始化与复制初始化的区别深入解析,是很多C++初学者需要深入了解的重要概念,需要的朋友可以参考下   C++中直接初始化与复制初始化是很多初学者容易混淆的概念,本文就以实例 ...

  9. xsd解析

    1. 解释: <xsd:element name="interceptors"> <xsd:annotation> 这一块是对第一行的注解(解释) < ...

  10. RTMP(实时信息传输协议)详解

    RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写,它是由Adobe公司提出的一种应用层的协议,用来解决多媒体数据传输流的多路复用(Multiplexing) ...