【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 }
View Code
转载于:https://www.cnblogs.com/LQLlulu/p/9882133.html
【POJ1509】Glass Beads 【后缀自动机】相关推荐
- POJ1509 Glass Beads [后缀自动机]
题意: 给一个字符串S,每次可以将它的第一个字符移到最后面,求这样能得到的字典序最小的字符串.输出开始下标 练习SAM第一题! SS构造SAM,然后从开始尽量走最小走n步就可以啦 什么?开始位置?!R ...
- POJ 1509 Glass Beads 后缀自动机
求给定字符串s从哪个位置开始的循环同构串字典序最小. 如果复制一遍s,发现其所有循环同构都是新字符串ss的长度为|s|的子串. 于是后缀自动机..dfs,不断地走字典序最小的边,直到走了|s|次即可. ...
- UVA719 Glass Beads 最小表示 / 后缀自动机
传送门 题意: 求sss的最小表示. ∣s∣≤1e4|s|\le 1e4∣s∣≤1e4 思路: 可以选择直接套最小表示法的板子,但也可以将sss复制,即ss=s+sss=s+sss=s+s,对ssss ...
- bzoj 2946 [Poi2000]公共串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...
- 后缀自动机 ---- P3804 【模板】后缀自动机(求每个等价类最长串的出现次数)
后缀自动机一些关键点 首先后缀自动机上面每个节点都是一个等价类并且是最长的字符串的结尾 后缀自动机上的fail链反建就是parent tree,下面是SAM和Parent tree的构造 对于这道模板 ...
- 洛谷P3966 [TJOI2013]单词(后缀自动机)
传送门 统计单词出现次数--为啥大家都是写AC自动机的嘞--明明后缀自动机也能做的说-- 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...
- hihocoder 后缀自动机专题
一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...
- @poj - 1509@ Glass Beads
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个由小写字母构成的圆环形的字符串(即首字母和末字母是相连的 ...
- BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...
最新文章
- 数据结构与算法(1)高斯算法
- linux的shell的功能,linux shell中${ }的一些特异功能
- 【找实习啊找实习(一)】
- 特征级融合_更丰富的卷积特征用于目标边缘检测(文末附有论文及源码下载)...
- Git之 手把手教你使用Git
- Mosquito的优化——epoll优化(七)
- 浅谈Rem 及其转换原理
- 产品迭代的节奏怎样适应需求的变化?
- 标榜 AI 的百度又玩区块链,跟风布局“加密猫”?
- 颜维伦暗示Sun将与英特尔合作研发芯片
- Postfix 故障记录
- vue项目history路由的配置
- 【Redis高手修炼之路】客户端工具——客户端工具以及常用命令
- mysql 索引选择原则 07
- UVA1335 Beijing Guards
- 毕业设计 stm32单片机的目标检测与跟踪系统 -物联网 openmv 嵌入式
- linux下格式化apfs,下一版 macOS High Sierra 将采用 APFS 文件系统
- 永磁同步电机力矩控制(六):PI算法
- DAC芯片CBM128S085
- java poi html转PDF_word和.txt文件转html 及pdf文件, 使用poi jsoup itext心得
热门文章
- 基于libmad库的MP3解码简析
- 安卓获取浏览器上网记录_Android 获取浏览器当前分享页面的截屏示例
- php 动态分页,PHP动态分页函数,PHP开发分页必备啦
- php博客浏览人数,在博客中实现浏览次数的统计
- mysql 多表关联建模_(四)多对多模式 - 数据库模型设计专栏 - CSDN博客
- java中静态方法可以被继承_关于java:静态方法中的继承
- 怎么看b树是几阶_看我在B站上怎么学习的
- java arraylist和list_Java中ArrayList和LinkedList区别
- presto能连接mysql和hive吗_Presto连接Hive
- java将按钮添加到指定位置_在运行时将按钮添加到布局