[SPOJ-BEADS]Glass Beads
来源:
CE1998
题目大意:
求字符串最小表示。
思路:
字符串复制一遍接在后面,构建SAM,然后每次跑小的转移。
跑n次以后就跑到了最小表示的末尾,用该状态的len值减去n就是最小表示的起始位置。
#include<string>
#include<iostream>
int n;
std::string s;
class SuffixAutomaton {
private:
static const int SIGMA_SIZE=;
struct State {
State *link,*trans[SIGMA_SIZE];
unsigned len,min_trans;
State(const int l) {
link=nullptr;
std::fill(&trans[],&trans[SIGMA_SIZE],nullptr);
min_trans=SIGMA_SIZE;
len=l;
}
};
State *root,*last;
unsigned idx(const int ch) {
return ch-'a';
}
void extend(const char ch) {
const unsigned w=idx(ch);
State *p=last,*new_p=new State(last->len+);
while(p!=nullptr&&p->trans[w]==nullptr) {
p->trans[w]=new_p;
p->min_trans=std::min(p->min_trans,w);
p=p->link;
}
if(p==nullptr) {
new_p->link=root;
} else {
State *q=p->trans[w];
if(q->len==p->len+) {
new_p->link=q;
} else {
State *new_q=new State(p->len+);
std::copy(&q->trans[],&q->trans[SIGMA_SIZE],new_q->trans);
new_q->min_trans=q->min_trans;
new_q->link=q->link;
q->link=new_p->link=new_q;
while(p!=nullptr&&p->trans[w]==q) {
p->trans[w]=new_q;
p=p->link;
}
}
}
last=new_p;
}
public:
void build() {
root=last=new State();
for(std::string::iterator i=s.begin();i<s.end();i++) {
extend(*i);
}
for(std::string::iterator i=s.begin();i<s.end();i++) {
extend(*i);
}
}
unsigned query() {
State *p=root;
for(unsigned i=;i<s.length();i++) {
p=p->trans[p->min_trans];
}
return p->len-s.length()+;
}
};
SuffixAutomaton sam;
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cin>>n;
for(int i=;i<n;i++) {
std::cin>>s;
sam.build();
std::cout<<sam.query()<<std::endl;
}
return ;
}
[SPOJ-BEADS]Glass Beads的更多相关文章
- POJ1509 Glass Beads
Glass Beads Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 4314 Accepted: 2448 Descr ...
- POJ1509 Glass Beads(最小表示法 后缀自动机)
Time Limit: 3000MS Memory Limit: 10000K Total Submissions: 4901 Accepted: 2765 Description Once ...
- 【POJ1509】Glass Beads
[POJ1509]Glass Beads [题目描述]给定字符串S,并规定首尾相连成环,求出最小字典序. [输入]输入有多个数据,第一行只包括正整数N,表示有N组数据.每个数据包括一行,输入该字符串. ...
- zoj 2006 Glass Beads
Glass Beadshttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1006 Time Limit: 2 Seconds ...
- cogs 2123. [HZOI 2015] Glass Beads
2123. [HZOI 2015] Glass Beads ★★★ 输入文件:MinRepresentations.in 输出文件:MinRepresentations.out 简单对比时 ...
- UVALive 5545 Glass Beads
Glass Beads Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origin ...
- POJ 1509 Glass Beads
Description 求字符串的最小循环表示. Sol SAM. 把原串复制一遍,建出SAM,然后每次选最小的一个跑 \(len\) 次,这就是最小循环表示的最后一个节点,然后 \(x-len+1\ ...
- 1509 -- Glass Beads POJ
题意:求一个字符串的最小表示的开始下标 就当模板题写了 把字符串重复一遍,再建后缀自动机,贪心的选最小字典序在上面走len步 因为走出来的一定是子串,长度又是len,所以一定是原来的字符串旋转得到的, ...
- 杂项(最小表示法):HZOI 2015 Glass Beads
[题目描述] 给定长度为n(n<=300000)的循环同构的字符串,定义最小表示为该字符串的字典序最小的同构表示,请输出这个表示. [输入格式] 第一行是串的长度,第二行是字符串. [输出格式] ...
- UVA 719 / POJ 1509 Glass Beads (最小表示法/后缀自动机)
题目大意: 给出一个长度为N的字符串,求其字典序最小的循环同构. N<=10W. 算法讨论: 算法一.最小表示法.定义题. 算法二.后缀自动机. Codes: #include <iost ...
随机推荐
- imperva-代理安装
首先创建网关上面的监听端口
- 如何编译和安装libevent【转】
转自:http://www.open-open.com/lib/view/open1455522194089.html 来自: http://blog.csdn.net/yangzhenping/ar ...
- Logback的继承体系
今天碰到一个问题,发现控制台日志输出两遍,搜索得知,这个是由于logback继承体系导致的. logback不仅会继承level,也会继承appender,需要注意的是: <root> & ...
- docker stack 部署 seafile(http)
=============================================== 2018/5/13_第1次修改 ccb_warlock == ...
- vue.js学习 自定义过滤器使用(2)
gitHub地址: https://github.com/lily1010/vue_learn/tree/master/lesson05 一 自定义过滤器(注册在Vue全局) 注意事项: (1)全局方 ...
- 超简单的java爬虫
最简单的爬虫,不需要设定代理服务器,不需要设定cookie,不需要http连接池,使用httpget方法,只是为了获取html代码... 好吧,满足这个要求的爬虫应该是最基本的爬虫了.当然这也是做复杂 ...
- 什么是 CLR(转)
CLR(公用语言运行时)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离..NET提供了一个运行时环境,叫做公用语言运行时(Comm ...
- 更新svn的客户端TortoiseSVN后 ,之前使用svn管理的文件的关联图标消失了
说明:下面的解决方法及图片来自博客:装了SVN,你的关联图标变了没有? 解决办法:在同步的文件点击右键如下图 ... 现则Settings,出现的界面如下 ... ...
- progressDialog和子线程模拟显示拷贝进度
package com.example.wang.myapplication; import android.app.ProgressDialog; import android.os.Bundle; ...
- Pg168—2题 修改
package org.hanqi.pn0120; public class JuXing { JuXing(double chang,double kuan) { this.chang=chang; ...