Glass Beads

UVA719
将循环串SSS展开成两倍大小:S+SS+SS+S,这样线性处理就可以处理所有循环的情况了。对S+SS+SS+S建立一个后缀自动机,让后从初始状态开始走,每次选择字典序最小的道路,走NNN步就得到一个字典序最小的原串了。假设最后走到ppp,那么此时首字符下标即为len(p)−N+1len(p)-N+1len(p)−N+1,即从首字符的位置走了NNN步到ppp。
AC代码:
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<map>
using namespace std;
const int MAXN = 20000;
int n;
char S[2*MAXN], Buffer[MAXN];
struct SAM {
	int size, last;
	struct Node {
		int len, link;
		int next[26];
		int cnt;
		void clear() {
			len = link = 0;
			memset(next, 0, sizeof(next));
		}
	} node[MAXN * 2];
	void init() {
		for (int i = 0; i < size; i++) {
			node[i].clear();
		}
		node[0].link = -1;
		size = 1;
		last = 0;
	}
	void insert(char x) {
		int ch = x - 'a';
		int cur = size++;
		node[cur].len = node[last].len + 1;
		node[cur].cnt = 1;
		int p = last;
		while (p != -1 && !node[p].next[ch]) {
			node[p].next[ch] = cur;
			p = node[p].link;
		}
		if (p == -1) {
			node[cur].link = 0;
		}
		else {
			int q = node[p].next[ch];
			if (node[p].len + 1 == node[q].len) {
				node[cur].link = q;
			}
			else {
				int clone = size++;
				node[clone] = node[q];
				node[clone].len = node[p].len + 1;
				node[clone].cnt = 0;
				while (p != -1 && node[p].next[ch] == q) {
					node[p].next[ch] = clone;
					p = node[p].link;
				}
				node[q].link = node[cur].link = clone;
			}
		}
		last = cur;
	}
} sam;
int main() {
	int T;
	scanf("%d", &T);
	while (T--) {
		sam.init();
		scanf("%s", S);
		n = strlen(S);
		strcpy(Buffer, S);
		strcat(S, Buffer);
		n = strlen(S);
		for (int i = 0; i < n; i++) {
			sam.insert(S[i]);
		}
		int&& Cur = 0;
		n /= 2;
		//走N步
		for (int i = 0; i < n ; ++i) {
			for (int j = 0; j < 26; ++j) {
				//如果走得通(走最小的)
				if (sam.node[Cur].next[j]) {
					Cur = sam.node[Cur].next[j];
					break;
				}
			}
		}
		printf("%d\n", sam.node[Cur].len - n + 1);
	}
	return 0;
}												
											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 ...
 
随机推荐
- Virtualbox EFI 写入startup.nsh
			
安装好的Debian系统,重启后会因为找不到入口而无法启动.定位grubx64.efi文件,可用ls直接查找或一步一步查找ls fs0:\EFI\debian\grubx64.efi edit fs0 ...
 - stata基础(十五)——线性回归的基本假定、估计回归系数、拟合系数
			
一.回归:回归是研究变量间相互关系的方法 1.条件分布:因变量在自变量取不同值时的分布 如果因变量在自变量取不同值时的条件分布都相同,那么自变量对因变量没有影响,否则就是有影响. 比较因变量在自变量取 ...
 - 推测执行 Speculative execution
			
如果我们只是靠随便网络上查找一个Speculative这个词的含义,是很难去理解的.但是我们通过查看英文原文去理解,可能就比较清楚地理解了: speculative (adjective) 1. ba ...
 - sdp安装及实例
			
环境: sdpserver:192.168.1.160 sdpclient:192.168.1.161 安装 yum install gcc gcc-c++ libpcap* libtool* wge ...
 - taro+vue3模板-废弃
			
一.初始化 1.Taro 基本安装并初始化项目 npx @tarojs/cli init WechatAppDemo 2.cd到新项目的文件夹 3.安装依赖:yarn 4.运行预览: yarn dev ...
 - 解决idea不能自动下载maven配置文件pom.xml下的jar包依赖的问题
			
表现:无法下载pom配置文件中的依赖包,或只能下载少数包,各项配置都正确的情况 理由未知: 百度了很长一段时间,网上给出比较精准的解决之一是 setting>>maven>>去 ...
 - tidb配置haproxy
			
1.安装haproxy wget https://www.haproxy.org/download/2.6/src/haproxy-2.6.2.tar.gz make clean make -j 8 ...
 - WDA学习(21):WDA Popup,Message,Focus
			
1.14 WDA Popup,Message,Focus WDA测试Popup,Message,光标Focus功能. 1.创建Component; COMPONENTCONTROLLER页签 Cont ...
 - macOS 10.14安装win10教程 bootcamp篇
			
由于工作以及系统使用习惯上的原因,拥有Mac电脑的用户常常需要用到windows系统,这个时候我们就需要在Mac上安装双系统来满足这一需求,一起来看看macOS 10.14安装win10教程吧. ma ...
 - ubuntu20关机慢: A stop job is running for Snappy daemon
			
Ubuntu 20 关机超时 问题 A stop job is running for Snappy daemon [1 min 30s ] 解决办法 1.修改以下配置文件超时时间,如下: sudo ...