[BJWC2010] 外星联络 - 后缀数组】的更多相关文章

[BJWC2010] 外星联络 Description 求一个 \(01\) 串中所有重复出现次数大于 \(1\) 的子串所出现的次数,按照字典序排序输出. Solution 预处理出后缀数组和高度数组. 对于每一个后缀 \(i\) ,如果 \(h[i+1]>h[i]\) ,我们就去找到在这之后对任意 \(j \in (h[i], h[i+1]]\) ,第一次出现 \(h[k]<j\) 的 \(k\) ,那么 \(k-i\) 就是这个子串出现的次数. 很不优美的解法,但是好像又没有别的办法.还…
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 670  Solved: 392[Submit][Status][Discuss] Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号…
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 424  Solved: 232[Submit][Status][Discuss] Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星 人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高 低电平将接收到…
[BZOJ2251][2010Beijing Wc]外星联络 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以他希望找到他接受到的 01 串中所有重…
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin) #define maxn 3000000 using namespace std; char str[maxn]; namespace SA { int n, m; int rk[maxn], sa[maxn], tp[maxn], tax[maxn], height[maxn]; void qsort(…
Brief Description 找到 01 串中所有重复出现次数大于 1 的子串.并按字典序输出他们的出现次数. Algorithm Design 求出后缀数组之后,枚举每一个后缀,对于每个后缀从height[i]+1枚举(因为height[i]之前已经计算过了),然后对于这样的每个前缀看一看上下能够分别延伸到哪里. 我不会分析复杂度,但是这个算法还是能跑得过得. Notice 开始想了一个复杂度低但是错误的算法,然后思路就被局限住了.所以,以后想不到好的算法的时候一定要先想一个最暴力的暴力…
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解 本来以为这道题应该从01序列的性质入手 结果就想歪了 等自己跳出了01序列这个思维 就马上看到了一颗Trie树... 这道题的较难思考的地方在于无法确定出每个字符串的字典序 所以我们想到了和字典序有关的东西sort+string字典树 我们知道所有后缀的所有前缀一定能取到所有字串 字典树的dfs序列得到的dfs序是按照字典序排列的 所以我们可以理所当然地用字典树来搞这个东西…
Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以他希望找到他接受到的 01 串中所有重复出现次数大于 1 的子串.但是他收到的信号串实在是太长了,于…
题目描述 暴力思路: 暴力枚举子串,插入trie树中,按字典序输出大于1的end的值 时间复杂度:n3 结果:TLE 0分 ...非常尴尬的一点不剩 正解思路 经过观察发现,可以只枚举后缀,统计时输出sum的值 code #include<bits/stdc++.h> using namespace std; const int MAXN=1e7; int n,cnt; string ss; struct node{ int sum,end,son[2]; }trie[MAXN]; void…
题目大意:给你一个长度为$n(n\leqslant3\times10^3)$的字符串,要你求出其中出现次数大于$1$的子串,并按字典序输出次数. 题解:建$SAM$后求出每个点的$size$,最后按字典序$dfs$一遍即可,这题$n$这么小,直接$O(n^2)$在$trie$上把每个点经过次数求出来,深搜即可. 卡点:无 C++ Code: #include <cstdio> #include <cstring> #define maxn 3005 #define N (maxn…
BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星 人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高 低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在 其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以 他希望找到他接受到…
外星联络 bzoj-2251 2010-BeiJing Wc 题目大意:题目链接. 注释:略. 想法: 这咋做啊????一看数据范围才$3\cdot 10^3$. 建立后缀数组. 所以我们将所有后缀排序后,每个后缀的$ht[i]+1$的位置显然这个子串是第一次出现. 我们统计每个子串第一次出现的位置然后统计有多少个即满足题意. 那么如何统计呢?我们只需要想后枚举到第一个$ht_j>ht_i$的即可因为$ht$有传递性. Code: #include <stdio.h> #include…
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 801  Solved: 481[Submit][Status][Discuss] Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号…
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 795  Solved: 477[Submit][Status][Discuss] Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号…
Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星 人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高 低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在 其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以 他希望找到他接受到的 01 串中所有重复出现次数大于 1 的子串.但是他收到的 信号串实在…
Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以他希望找到他接受到的 01 串中所有重复出现次数大于 1 的子串.但是他收到的信号串实在是太长了,于…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解: 后缀数组,倍增,RMQ 题意:把重复次数超过 1次的子串按字典序输出它们重复的次数. 构建后缀数组,得到 height[]按排名从小到大枚举每个后缀 i,考虑它产生的之前没有出现过的子串是否重复次数大于1次.用到倍增(不想写二分)求出: 包含 i的最大[l,r]范围使得这个范围内的后缀与 i后缀的 LCP大于当前判断的子串的长度.然后把合法的子串的重复次数输出即可. 代码:…
问题描述 LG4341 BZOJ2251 BZOJ需要权限号 题解 字符串的性质:一个字符串\(s\)所有的字串,等于\(s\)所有后缀的前缀. 枚举这个字符串的每一个后缀,将其插入一个\(\mathrm{Trie}\) 在插入\(\mathrm{Trie}\)的过程中可以非常方便的维护这个后缀的每个前缀. 最后从\(root\)开始对整棵\(\mathrm{Trie}\)进行一次遍历即可. \(\mathrm{Code}\) #include<bits/stdc++.h> using nam…
因为n很小,所以对于串s的每一个后缀,都把其加入字典树中,并且经过一个字典树节点,该节点权值就+1. 输出时因为要字典序最小,所以字典树先走0分叉,再走1分叉,如果节点权值大于等于2就输出 代码 #include<cstdio> ; ],tot,i; char s[N]; void gao(int x) { ,i; for (i=x;i<n;i++) { ]==) f[t][s[i]-]=++tot; t=f[t][s[i]-]; sum[t]++; } } void out(int x…
题意: 给出一个字符串,求出现次数超过1的子串的出现个数. 字符串长度<=3000: 题解: 题目问的是子串的个数.那么首先我们要找到全部的子串. 而字符串的全部后缀的前缀能够不重不漏的表示全部子串: 那么假设将全部的后缀增加trie树.每一个经过的结点--也就是这个后缀的前缀--计数+1. 然后题目要求按字典序输出.利用一下trie树性质搞好就完了. 指针版trie好慢啊. .. 代码: #include<stdio.h> #include<string.h> #inclu…
先求SA,然后按字典序从小到大枚举子串,每到一个后缀从长到短枚举子串(跳过长为he[i]的和前一段重复的子串),然后维护一个点p,保证i~p之间最小的he>=当前枚举长度,p是单调向右移的 然后把每个后缀的结果倒着输出即可 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=3005; int n,m,wa[N],wb[N],wv[N],wsu…
题目描述: 找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠). code: 后缀数组处理,对于得到height 进行查找...  参考http://blog.csdn.net/mishifangxiangdefeng/article/details/7109211博主的详细的代码思路 #include<iostream> #include<string> using namespace std; #define N 1200 string s; *N], rank…
永恒的大牛,kuangbin,膜拜一下,Orz 链接:http://www.cnblogs.com/kuangbin/archive/2013/04/23/3039313.html Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14334   Accepted: 4945 Description A musical melody is represented as a sequence of…
题意:问a串中有多少种字符串集合B中没有的连续子串. a的长度10^5,B中的总长度为不超过10^5. 解法:后缀数组题目:后缀数组能够非常easy算出来一个串中有多少种子串. 把a和B集合连起来.求一次不同子串数量,然后减掉B相互连起来的数量. 在求时候,要减掉含有链接符的子串,方法是扫一遍,枚举最后出现的连接符. 代码: /****************************************************** * @author:xiefubao ***********…
后缀树: 字符串匹配算法一般都分为两个步骤,一预处理,二匹配. KMP和AC自动机都是对模式串进行预处理,后缀树和后缀数组则是对文本串进行预处理. 后缀树的性质: 存储所有 n(n-1)/2 个后缀需要 O(n) 的空间,n 为的文本(Text)的长度: 构建后缀树需要 O(dn) 的时间,d 为字符集的长度(alphabet): 对模式(Pattern)的查询需要 O(dm) 时间,m 为 Pattern 的长度: 介绍后缀树之前,我们首先要知道压缩字典树的概念. 我们在对关键字建立字典树的时…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 题意:告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k 次. 解法:后缀数组.我们先考虑至少出现k 次的子串, 所以我们枚举排好序的后缀i (sa[i]) .然后k段k 段的枚举.假设当前枚举的是 sa[i]~sa[i + k -1],那么假设这一段的最长公共前缀  是L 的话.那么就有L 个不同的子串至少出现了k次.我们要减去至少出现k + 1次的 , 但还要和这个k 段…
1923: [Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01”串按位依次表示每只虫 子是否被放入机器:如果第 i 个字符是“0”则代表编号为 i 的虫子未被放入,“1” 则代表已被放入.后面跟的数字是统计的昆虫足数 mod 2 的结果. 由于 NASA的实验机器精确无误,保证前后数据不会自相矛盾.即给定数据 一定有…
题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题. “主题”是整个音符序列的一个子串,它需要满足如下条件:1.长度至少为5个音符2.在乐曲中重复出现(可能经过转调,“转调”的意思是主题序列中每个音符都被加上或减去了同一个整数值.)3.重复出现的同一主题不能有公共部分. 链接:点我先转化成相邻两项的差值,然后就是找不可重叠重复子串.做法就是二分答案LEN然后根据height值进行分组 第一道后缀数组题,测了一下模板…
Front compression Time Limit: 5000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total Submission(s): 158    Accepted Submission(s): 63 Problem Description Front compression is a type of delta encoding compression algorithm wher…
牛奶模式 时间限制: 5000MS   内存限制: 65536K 提交总数: 16796   接受: 7422 案件时间限制: 2000MS 描述 农夫约翰已经注意到,他的牛奶的质量每天都在变化.经进一步调查,他发现虽然不能预测一天到下一天的牛奶质量,但每天的牛奶质量有一些规律. 要执行严格的研究,他已经发明了其中每个奶样本被记录为0到1,000,000之间的整数一个复杂的分类方案,并且已经从单一的母牛超过记录数据Ñ(1≤ Ñ ≤20000)天.他希望找到其等同至少K(2≤重复样品的最长图案ķ …