BZOJ 2882 工艺 (字符串最小循环同构)
题目大意:
给一个长度小于等于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 工艺 (字符串最小循环同构)的更多相关文章
- hdu 4333"Revolving Digits"(KMP求字符串最小循环节+拓展KMP)
传送门 题意: 此题意很好理解,便不在此赘述: 题解: 解题思路:KMP求字符串最小循环节+拓展KMP ①首先,根据KMP求字符串最小循环节的算法求出字符串s的最小循环节的长度,记为 k: ②根据拓展 ...
- BZOJ 2882: 工艺
2882: 工艺 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 599 Solved: 268[Submit][Status][Discuss] D ...
- BZOJ 2882: 工艺( 后缀自动机 )
把串S复制成SS然后扔进后缀自动机里, 从根选最小的儿子走, 走N步就是答案了...一开始还想写个treap的...后来觉得太麻烦..就用map了... ----------------------- ...
- poj 2406 Power Strings【字符串+最小循环节的个数】
Po ...
- KMP解决字符串最小循环节相关问题
经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个 ...
- BZOJ.2882.工艺(后缀自动机 最小表示 map)
题目链接 BZOJ 洛谷 SAM求字符串的最小循环表示. 因为从根节点出发可以得到所有子串,所以每次找字典序最小的一个出边走即可.因为长度问题把原串再拼接在后面一次. 需要用map存转移.复杂度O(n ...
- BZOJ 2882 工艺 ——后缀自动机 最小表示法
先说后缀自动机的做法. 直接把S串复制一遍成SS,然后建立后缀自动机,go边相当于在当前字符的后面插入,而son边可以看作在字符串前面加一个字符. 所以贪心的走字典序最小的边即可,而且根据后缀自动机的 ...
- 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 ...
- 【刷题】BZOJ 2882 工艺
Description 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工 ...
随机推荐
- Tomcat unable to start
在学习springMvc时,导入springfreemarker 的jar包,写好web.xml,config.xml 后. 部署到tomcat,异常如下: 八月 27, 2016 5:44:41 下 ...
- hdu5353 Average(模拟)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Average Time Limit: 4000/2000 MS (Java/Ot ...
- python进行base64编解码
[转] 直接上代码 import base64 fin = open(r"D:\2.zip", "rb") fout = open(r"D:\2.x. ...
- 客户端技术:Cookie 服务端技术:HttpSession
客户端技术:Cookie 服务端技术:HttpSession 07. 五 / android基础 / 没有评论 一.会话技术1.什么是会话:客户打开浏览器访问一个网站,访问完毕之后,关闭浏览器.这 ...
- POJ3041 二分图最大匹配
问题:POJ3041 分析: 构造二分图:令A = B = { 1, 2, ... , n }, 分别代表行号集与列号集.假如第i行第j列有一颗行星,则连接Ai与Bj, 表示必须从Ai(即第i行),B ...
- The Time in Words
def main(): time = ["one", "two", "three", "four", "fiv ...
- volatile详解
海子的Java并发编程:volatile关键字解析讲的已经非常不错了,通俗易懂,给32个赞!
- 2015第14周五Tomcat版本
首先看tomcat官方文档,列出的不同版本的主要差别: Servlet Spec JSP Spec EL Spec WebSocket Spec Apache Tomcat version Actua ...
- log4net logfornet 配置和用法
较好的参考地址: http://in3040.blog.163.com/blog/static/116702443201091354028744/ http://dev.tot.name/dotnet ...
- Search in Rotated Sorted Array (I, II) 解答
Question Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 ...