题目大意:

给一个长度小于等于30W的数列,求其最小循环同构。

算法讨论:

在自动机长倍长走S后即可。注意这里面是数字,要用map存储。 今天才知道要开四倍长。

Codes:

 #include <bits/stdc++.h>
using namespace std; const int L = + ; int n, a[L<<], ans; struct State{
int len, pre;
map <int, int> next; State(){
len = pre = ;
next.clear();
}
void clear(){
len = pre = ;
next.clear();
}
}st[L<<]; struct SuffixAutomaton{
int sz, last; void Init(){
last = sz = ;
st[].len = ; st[].pre = -;
sz ++;
}
void Extend(int c){
int cur = sz ++;
st[cur].len = st[last].len + ;
int p; for(p = last; p != - && !st[p].next[c]; p = st[p].pre)
st[p].next[c] = cur; if(p == -) st[cur].pre = ;
else{
int q = st[p].next[c];
if(st[q].len == st[p].len + ) st[cur].pre = q;
else{
int cle = sz ++;
st[cle].len = st[p].len + ;
st[cle].pre = st[q].pre;
st[cle].next = st[q].next;
for(; p != - && st[p].next[c] == q; p = st[p].pre)
st[p].next[c] = cle;
st[q].pre = st[cur].pre = cle;
}
}
last = cur;
}
}SAM; void Input(){
scanf("%d", &n);
for(int i = ; i < n; ++ i)
scanf("%d", &a[i]);
}
void Output(){
bool flag = false;
for(int i = ans; i < ans + n; ++ i){
if(!flag){
flag = true;
printf("%d", a[i % n]);
}
else
printf(" %d", a[i % n]);
} printf("\n");
} void Solve(){
SAM.Init();
for(int i = ; i < n; ++ i)
a[i + n] = a[i];
for(int i = ; i < (n<<); ++ i)
SAM.Extend(a[i]); int p = ;
map <int, int>:: iterator pos; for(int i = ; i < n; ++ i){
for(pos = st[p].next.begin(); pos != st[p].next.end(); ++ pos){
p = (*pos).second;
break;
}
} ans = st[p].len - n;
} int main(){ Input();
Solve();
Output(); return ;
}

BZOJ 2882

BZOJ 2882 工艺 (字符串最小循环同构)的更多相关文章

  1. hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)

    传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...

  2. BZOJ 2882: 工艺

    2882: 工艺 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 599  Solved: 268[Submit][Status][Discuss] D ...

  3. BZOJ 2882: 工艺( 后缀自动机 )

    把串S复制成SS然后扔进后缀自动机里, 从根选最小的儿子走, 走N步就是答案了...一开始还想写个treap的...后来觉得太麻烦..就用map了... ----------------------- ...

  4. poj 2406 Power Strings【字符串+最小循环节的个数】

                                                                                                      Po ...

  5. KMP解决字符串最小循环节相关问题

    经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个 ...

  6. BZOJ.2882.工艺(后缀自动机 最小表示 map)

    题目链接 BZOJ 洛谷 SAM求字符串的最小循环表示. 因为从根节点出发可以得到所有子串,所以每次找字典序最小的一个出边走即可.因为长度问题把原串再拼接在后面一次. 需要用map存转移.复杂度O(n ...

  7. BZOJ 2882 工艺 ——后缀自动机 最小表示法

    先说后缀自动机的做法. 直接把S串复制一遍成SS,然后建立后缀自动机,go边相当于在当前字符的后面插入,而son边可以看作在字符串前面加一个字符. 所以贪心的走字典序最小的边即可,而且根据后缀自动机的 ...

  8. BZOJ 2882: 工艺 (SA/SAM/最小表示法)

    我写的O(nlogn)O(nlogn)O(nlogn)的SA 8000ms 被 O(n)O(n)O(n)的SAM 2800ms 和 O(n)O(n)O(n)的最小表示法 500ms 头都锤爆- COD ...

  9. 【刷题】BZOJ 2882 工艺

    Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工 ...

随机推荐

  1. 转载--eclipse git插件安装

    原文地址:http://yufenfei.iteye.com/blog/1750124/ 一.Eclipse上安装GIT插件EGit Eclipse的版本eclipse-java-helios-SR2 ...

  2. CSS: Table-Layout & Word-Break 设置表和列的宽度固定不变

    1. 设置Table的列宽由表格宽度和列宽度设定(指定表格宽度,各个列宽度): table#tbl_id{table-layout:fixed;} 2. 设置TD内容根据宽度进行换行,即使字符串之间无 ...

  3. MrHuo.OAuthLoginLibs社会化登录组件Github

    今日写的博客 [原创]旧事重提:只配置参数实现OAuth2登录 引来很多园子里的朋友问候,所以今日花了一些时间整理了代码. 现已发布至github: MrHuo.OAuthLoginLibs:http ...

  4. css3实现各种渐变效果,比较适合做手机触屏版

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 伪协议触发onbeforeunload

    根据MSDN描述,IE的onbeforeunload事件触发条件: 简单点来说就是页面URL发生改变时触发: * 关闭浏览器窗口 * 点击后退.前进.刷新.主页 * 点击链接到新页面 * 调用超链接的 ...

  6. MySQL 设置远程访问

    MySQL远程访问,也就是通过ip访问MySQL服务,MySQL对于安全的要求是非常严格的,需要授权. 1.本地访问 GRANT ALL PRIVILEGES ON *.* TO admin@loca ...

  7. 第一次碰到try-except(core python programming 2nd Edition 3.6)

    # coding: utf-8 # 使用Windows系统,首行'#!/usr/bin/env Pyton'无用,全部改为'# coding: utf-8' 'readtextfile.py -- r ...

  8. AngularJS 基础教程一:

    一:了解AngularJS AngularJS是一款非常优秀的前端高级 JS 框架,由 Misko Hevery 等人创建 2009 年被 Google 收购,用于其多款产品 有一个全职的开发团队继续 ...

  9. OC与Swift混编

    群里大神发的网址,感觉有用就先收录了,暂时没时间看SWIFT,感觉代码简洁,但是可阅读性不是太高,有些代码让系统去判断类型,同样的,我们看代码的时候也得自己去判断类型,或许看多就习惯了,有时间再说吧, ...

  10. Core Data (2)-备用

    1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型 在Mac OS X 10.5Leopard及以后的版本中 ...