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

题意

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

分析

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

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

  

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <map>
 6
 7 using namespace std;
 8 const int maxn=20000+100;
 9 char s[maxn];
10 int n,T;
11 struct state{
12     map<char,int>next;
13     int len,link;
14 }st[4*maxn];
15 int last,cnt,cur;
16 void init(){
17     last=cur=0;
18     cnt=1;
19     st[0].len=0;
20     st[0].link=-1;
21     st[0].next.clear();
22 }
23 void build(char c){
24     cur=cnt++;
25     st[cur].next.clear();
26     st[cur].len=st[last].len+1;
27     int p;
28     for(p=last;p!=-1&&!st[p].next.count(c);p=st[p].link)
29         st[p].next[c]=cur;
30     if(p==-1)
31         st[cur].link=0;
32     else{
33         int q=st[p].next[c];
34         if(st[p].len+1==st[q].len)
35             st[cur].link=q;
36         else{
37             int clone=cnt++;
38             st[clone].next=st[q].next;
39             st[clone].link=st[q].link;
40             st[clone].len=st[p].len+1;
41             for(;p!=-1&&st  [p].next[c]==q;p=st[p].link)
42                 st[p].next[c]=clone;
43             st[q].link=clone;st[cur].link=clone;
44         }
45     }
46     last=cur;
47 }
48 int main(){
49     scanf("%d",&T);
50     for(int t=1;t<=T;t++){
51         scanf("%s",s);
52         n=strlen(s);
53         for(int i=0;i<n;i++)
54             s[i+n]=s[i];
55         init();
56         for(int i=0;i<n;i++)
57             build(s[i]);
58         for(int i=n;i<2*n;i++)
59             build(s[i]);
60         int u=0;
61         for(int i=0;i<n;i++){
62             for(int j=‘a‘;j<=‘z‘;j++){
63                 if(st[u].next.count(j)){
64                     u=st[u].next[j];
65                     break;
66                 }
67             }
68         }
69         int ans=st[u].len-n+1;
70         printf("%d\n",ans);
71     }
72 return 0;
73 }

原文地址:https://www.cnblogs.com/LQLlulu/p/9882133.html

时间: 2024-10-11 12:47:37

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

POJ 1509 Glass Beads 后缀自动机

题目大意:给出一个环形的字符串,问从哪里开始是的这个字符串的字典序最小. 思路:最小表示法和后缀自动机的裸题,不过我是为了学后缀自动机才写的这个题,就没有去学最小表示法. 做法很简单,先建立一个后缀自动机,然后从根开始沿tranc指针从a->z走len次到达的点就是字典序最小的字符串的结尾点,求起始点只要减一下长度再+1即可. 对于后缀自动机的理解:http://wyfcyx.is-programmer.com/posts/76107.html CODE: #include <cstdio&g

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

http://poj.org/problem?id=1509 后缀自动机其实就是一个压缩储存空间时间(对节点重复利用)的储存所有一个字符串所有子串的trie树,如果想不起来长什么样子可以百度一下找个图回忆,从0开始到任意一个点的串都是字符串的子串. 有一些很好用的性质. 字符串的最小表示就是把一个字符串首尾相连再从任意一个地方断开产生的字典序最小的字符串,这个题是求最小表示的开头字母在原字符串中的下标(从1开始). 具体看实现吧,没什么可以解释的地方. 1 #include<iostream>

POJ1509 Glass Beads 【后缀自动机】

题目大意 找一个环串的起点,使得从其开始遍历字典序最小 题解 建立后缀自动机,从根开始走length步,走到的点就是这个最小串的结尾,其step即表示它在串中的位置 step - n + 1即为开始位置 #include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long int #define

后缀自动机习题合集

(写的都是初中小朋友czl早就切过的题……) http://www.cnblogs.com/Lyush/p/3281546.html POJ-1509 Glass Beads UVA - 719 Glass Beads 题意:一个字符串可以将第一个字符放到最后一位,然后问不断这样做可以得到的字典序最小的字符串 sam模板题,copy一遍建个sam,然后直接在sam中跑一遍就行了. sam记录了字符串的所有后缀(也随便记录了字串),从root开始到每个接受态节点都是一个后缀(或多个),从root开

SPOJ-BEADS UVA719 UVALive5545 POJ1509 ZOJ2006 Glass Beads【字符串环的最小】

Glass Beads Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 5254 Accepted: 2943 Description Once upon a time there was a famous actress. As you may expect, she played mostly Antique Comedies most of all. All the people loved her. But she w

后缀自动机(SAM)学习指南

*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符串所有后缀的自动机. 它最早在陈立杰的 2012 年 noi 冬令营讲稿中提到. 在2013年的一场多校联合训练中,陈立杰出的 hdu 4622 可以用 SAM 轻松水过,由此 SAM 流行了起来. 一般来说,能用后缀自动机解决的问题都可以用后缀数组解决.但是后缀自动机也拥有自己的优点. 1812.

后缀自动机(SAM)

*在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符串所有后缀的自动机. 它最早在陈立杰的 2012 年 noi 冬令营讲稿中提到. 在2013年的一场多校联合训练中,陈立杰出的 hdu 4622 可以用 SAM 轻松水过,由此 SAM 流行了起来. 一般来说,能用后缀自动机解决的问题都可以用后缀数组解决.但是后缀自动机也拥有自己的优点. 1812.

hiho一下第128周 后缀自动机二&#183;重复旋律5

#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中出现了多少不同的旋律? 解题方法提示 输入 共一行,包含一个由小写字母构成的字符串.字符串长度不超过 1000000. 输出 一行一个整数,表示答案. 样例输入 aab 样例输出 5 解题方法提示 小Hi:本周的题目其实就是给定一个字符串S,要求出S的所有不同子串的数

UVALive 5545 Glass Beads

Glass Beads Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 554564-bit integer IO format: %lld      Java class name: Main Once upon a time there was a famous actress. As you may expect, she played mostly