2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 424  Solved: 232[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)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号…
[BZOJ2251][2010Beijing Wc]外星联络 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以他希望找到他接受到的 01 串中所有重…
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解: 后缀数组,倍增,RMQ 题意:把重复次数超过 1次的子串按字典序输出它们重复的次数. 构建后缀数组,得到 height[]按排名从小到大枚举每个后缀 i,考虑它产生的之前没有出现过的子串是否重复次数大于1次.用到倍增(不想写二分)求出: 包含 i的最大[l,r]范围使得这个范围内的后缀与 i后缀的 LCP大于当前判断的子串的长度.然后把合法的子串的重复次数输出即可. 代码:…
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 开始想了一个复杂度低但是错误的算法,然后思路就被局限住了.所以,以后想不到好的算法的时候一定要先想一个最暴力的暴力…
先求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…
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 801  Solved: 481[Submit][Status][Discuss] Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号…
Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星 人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高 低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在 其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以 他希望找到他接受到的 01 串中所有重复出现次数大于 1 的子串.但是他收到的 信号串实在…
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 670  Solved: 392[Submit][Status][Discuss] Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号…
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…
[BJWC2010] 外星联络 Description 求一个 \(01\) 串中所有重复出现次数大于 \(1\) 的子串所出现的次数,按照字典序排序输出. Solution 预处理出后缀数组和高度数组. 对于每一个后缀 \(i\) ,如果 \(h[i+1]>h[i]\) ,我们就去找到在这之后对任意 \(j \in (h[i], h[i+1]]\) ,第一次出现 \(h[k]<j\) 的 \(k\) ,那么 \(k-i\) 就是这个子串出现的次数. 很不优美的解法,但是好像又没有别的办法.还…
因为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…
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解 本来以为这道题应该从01序列的性质入手 结果就想歪了 等自己跳出了01序列这个思维 就马上看到了一颗Trie树... 这道题的较难思考的地方在于无法确定出每个字符串的字典序 所以我们想到了和字典序有关的东西sort+string字典树 我们知道所有后缀的所有前缀一定能取到所有字串 字典树的dfs序列得到的dfs序是按照字典序排列的 所以我们可以理所当然地用字典树来搞这个东西…
Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以他希望找到他接受到的 01 串中所有重复出现次数大于 1 的子串.但是他收到的信号串实在是太长了,于…
2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 563  Solved: 274[Submit][Status][Discuss] Description 假设我们有矩阵,其元素值非零即1 a11…… a1m ……………. an1…….anm 定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-L)  Input 输入文件的第一行为两个整数,分别代表n和m. …
题目 2252: [2010Beijing wc]矩阵距离 Time Limit: 10 Sec  Memory Limit: 256 MB Description 假设我们有矩阵,其元素值非零即1 a11…… a1m ……………. an1…….anm 定义aij与akl之间的距离为D(aij,akl)=abs(i-k)+abs(j-L)  Input 输入文件的第一行为两个整数,分别代表n和m. 接下来的n行,第i行的第 j个字符代表aij Output 输出包含N行,每行M个用空格分开…
---恢复内容开始--- 题目链接:BZOJ - 1692 题目分析 首先,有个比较简单的贪心思路:如果当前剩余字符串的两端字母不同,就选取小的字母,这样显然是正确的. 然而若两端字母相同,我们怎么选取呢? 这时我们要从两端分别向内部比较,看那一端向内的字符串字典序小. 比如这个字符串 ABCDBA,从左端向内是 ABC.. 从右端向内是 ABD... 所以就选取左端的字符. 这样直接比较是 O(n^2) 的,我们可以使用后缀数组的 Rank 数组来比较. 我们在字符串后加上分隔符,然后再将字符…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4650 题意: 给你一个字符串s,问你s及其子串中,将它们拆分成"AABB"的方式共有多少种. 题解: 先只考虑"AA"的形式. 设pre[i]表示以s[i]结尾的"AA"串共有多少个,nex[i]表示以s[i]开头的"AA"串共有多少个. 那么拆分成"AABB"的总方案数 = ∑ pre[i]*ne…
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞出后缀数组; 然后顺序枚举i; 对于sa[i]< n的输出对应的s[sa[i]+n-1]就好了 后缀的含义是把后缀按照字典序从小到大排一下. 按照这个规则; 就能搞了; 必然是在前n个字符中就能比较出来; 所以及时后缀多了一些也没事. [完整代码] #include <bits/stdc++.h&…
问题描述 LG4341 BZOJ2251 BZOJ需要权限号 题解 字符串的性质:一个字符串\(s\)所有的字串,等于\(s\)所有后缀的前缀. 枚举这个字符串的每一个后缀,将其插入一个\(\mathrm{Trie}\) 在插入\(\mathrm{Trie}\)的过程中可以非常方便的维护这个后缀的每个前缀. 最后从\(root\)开始对整棵\(\mathrm{Trie}\)进行一次遍历即可. \(\mathrm{Code}\) #include<bits/stdc++.h> using nam…
题意: 给出一个字符串,求出现次数超过1的子串的出现个数. 字符串长度<=3000: 题解: 题目问的是子串的个数.那么首先我们要找到全部的子串. 而字符串的全部后缀的前缀能够不重不漏的表示全部子串: 那么假设将全部的后缀增加trie树.每一个经过的结点--也就是这个后缀的前缀--计数+1. 然后题目要求按字典序输出.利用一下trie树性质搞好就完了. 指针版trie好慢啊. .. 代码: #include<stdio.h> #include<string.h> #inclu…
题目描述 暴力思路: 暴力枚举子串,插入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…
题目 传送门:QWQ 分析 高斯消元解异或方程组,和解普通方程组差不多. 范围有点大,要套一个bitset. 代码 #include <bits/stdc++.h> using namespace std; ; bitset<maxn> a[maxn*]; ], ans=; void Gauss() { ;i<=n;i++) { ; for(int j=i;j<=m;j++) ) { swap(a[i],a[j]); swap(b[i],b[j]); flag=; an…
题目大意:给你一个长度为$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…
Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是,他每天晚上都爬在屋顶上试图用自己的收音机收听外星人发来的信息.虽然他收听到的仅仅是一些噪声,但是他还是按照这些噪声的高低电平将接收到的信号改写为由 0 和 1 构成的串, 并坚信外星人的信息就隐藏在其中.他认为,外星人发来的信息一定会在他接受到的 01 串中重复出现,所以他希望找到他接受到的 01 串中所有重复出现次数大于 1 的子串.但是他收到的信号串实在是太长了,于…
全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries + BIT 就行了.时间复杂度O(N log N). 速度垫底了QAQ 你们都会SAM.... ---------------------------------------------------------------------- #include<cmath> #include<c…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119 思路就是对于这个形如 ABA 的串,枚举 A 的长度,并按照长度分出几块,找到一些关键点就是块的开头: 那么每一种 ABA 的串,A 的部分一定覆盖了一个关键点: 所以找关键点周围的匹配长度算答案,具体就是找和对应位置的 lcp + lcs,那么 ABA 可以在对应匹配的地方滑动,就能找到所有 ABA 了: 因为是差分数组所以 n-1,而且注意连接正反串的字符要比串内字符小,不是 '…
算是SA的裸题了 把串复制一遍接在原串后面,然后求SA,然后按着SA的顺序输出尾字符即可 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=200005; int n,sa[N],wa[N],wb[N],wv[N],wsu[N]; char s[N]; bool cmp(int r[],int a,int b,int l) { return r[a…