POJ1509 Glass Beads [后缀自动机]
题意:
给一个字符串S,每次可以将它的第一个字符移到最后面,求这样能得到的字典序最小的字符串。输出开始下标
练习SAM第一题!
SS构造SAM,然后从开始尽量走最小走n步就可以啦
什么?开始位置?!Right集合中最左的位置-len
直接t[u].val-n+1,为什么啊没有一个人的题解解释呜呜呜呜呜呜
想了想,这个最小串Right等价类的最长串一定到了开头位置,卡不掉吧,最小串唯一一定成立,如果不唯一好像只可能是自己吧
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=2e4+5; int n; char s[N]; struct State{int ch[26],par,val;State():par(0),val(0){memset(ch,0,sizeof(ch));} }t[N<<1]; int sz,root,last; inline int nw(int _){t[++sz].val=_;return sz;} void iniSAM(){sz=0;root=last=nw(0);} void extend(int c){int p=last,np=nw(t[p].val+1);while(p&&t[p].ch[c]==0) t[p].ch[c]=np,p=t[p].par;if(p==0) t[np].par=root;else{int q=t[p].ch[c];if(t[q].val==t[p].val+1) t[np].par=q;else{int nq=nw(t[p].val+1);memcpy(t[nq].ch,t[q].ch,sizeof(t[q].ch));t[nq].par=t[q].par;t[q].par=t[np].par=nq;while(p&&t[p].ch[c]==q) t[p].ch[c]=nq,p=t[p].par;}}last=np; } void solve(){iniSAM();memset(t,0,sizeof(t));for(int i=1;i<=n;i++) extend(s[i]-'a');for(int i=1;i<=n;i++) extend(s[i]-'a');int u=root;for(int i=1;i<=n;i++)for(int k=0;k<26;k++) if(t[u].ch[k]) {u=t[u].ch[k];break;}printf("%d\n",t[u].val-n+1); } int main(){freopen("in","r",stdin);int T;scanf("%d",&T);while(T--){scanf("%s",s+1);n=strlen(s+1);solve();} }
POJ1509 Glass Beads [后缀自动机]相关推荐
- POJ 1509 Glass Beads 后缀自动机
求给定字符串s从哪个位置开始的循环同构串字典序最小. 如果复制一遍s,发现其所有循环同构都是新字符串ss的长度为|s|的子串. 于是后缀自动机..dfs,不断地走字典序最小的边,直到走了|s|次即可. ...
- 【POJ1509】Glass Beads 【后缀自动机】
题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...
- 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则表示不同位置的相同子串算作一个. ...
最新文章
- 【解决办法】No module named 'ahocorasick'
- 如何绘制caffe网络训练曲线
- windows下oracle数据库自动备份脚本
- android p wifi一直在扫描_Android再次解读萤石云视频
- openshift_OpenShift上的Java EE工作流(技术提示#64)
- 钉钉宣布品牌全新升级 首次明确回答了自身和生态的关系
- mats检测工具 400版_川崎新款忍者400新配色发布
- 虚拟机的管理(libvirtd)、移植和快照
- Face alignment at 3000 FPS via Regressing Local Binary Features
- 《推荐系统笔记(十六)》tf-idf与基于内容的推荐(简单的酒店推荐)
- rtcp webrtc 接收_WebRTC RTP/RTCP 源码分析(四):RTCP 的接收和解析
- python自动化办公都能做什么-用 Python 自动化办公能做到哪些有趣或有用的事情?...
- matlab_exercise(2)----输入一个三位数,依次输出其个位数字,十位数字,百位数字...
- 创建额外域控制器Active Directory(二)
- 电商系统(毕业设计)
- 基于英飞凌TC397芯片Mcal配置之Can模块的配置
- 手工做迷宫_纸盒子废物利用手工自制小迷宫教玩具给幼儿玩(步骤图解)
- <<数值分析>>第二章线性方程组的直接解法
- 学习曲线和决策边界的绘制
- 基于php的婚纱影楼管理系统