博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
●POJ 1509 Glass Beads
阅读量:5260 次
发布时间:2019-06-14

本文共 1031 字,大约阅读时间需要 3 分钟。

题链:

题解:

给出一个字符串,有一个操作:把首字符放到末尾,形成新的串。

求任意次操作后,字典序最小的串的首字母在原串中的位置。
(这就是最小表示法?哈)

把原串翻倍,建立后缀自动机。

然后在自动机上从起点往当前节点的较小的字母上跑len步即可。
代码:

#include
#include
#include
#define MAXN 40050#define filein(x) freopen(#x".in","r",stdin);#define fileout(x) freopen(#x".out","w",stdout);using namespace std;struct SAM{ int size,last,p,q,np,nq; int step[MAXN],pre[MAXN],ch[MAXN][26]; int newnode(int a,int b){ step[size]=a; memcpy(ch[size],ch[b],sizeof(ch[b])); return size++; } void add(int x){ p=last; last=np=newnode(step[p]+1,0); while(p&&!ch[p][x]) ch[p][x]=np,p=pre[p]; if(!p) pre[np]=1; else{ q=ch[p][x]; if(step[p]+1!=step[q]){ nq=newnode(step[p]+1,q); pre[nq]=pre[q]; pre[q]=pre[np]=nq; while(p&&ch[p][x]==q) ch[p][x]=nq,p=pre[p]; } else pre[np]=q; } } void build(char *S){ memset(ch[0],0,sizeof(ch[0])); size=1; last=newnode(-1,0); for(int i=0;S[i];i++) add(S[i]-'a'); }}suf;int find(int len){ int p=1; for(int i=0;i

转载于:https://www.cnblogs.com/zj75211/p/7988518.html

你可能感兴趣的文章
161017、SQL必备知识点
查看>>
hdu 1541Stars
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
C# GC 垃圾回收机制
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
java的同步实现
查看>>
H3C 单区域OSPF配置示例一
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
iOS常用开源库2
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
使用Git、Git GUI和TortoiseGit
查看>>
Servlet 远程服务IO流传输数据
查看>>
Python学习(七)面向对象 ——继承和多态
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
阴影:box_shadow
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>