[bzoj2251][2010Beijing Wc]外星联络——后缀数组+暴力求解
Brief Description
找到 01 串中所有重复出现次数大于 1 的子串。并按字典序输出他们的出现次数。
Algorithm Design
求出后缀数组之后,枚举每一个后缀,对于每个后缀从height[i]+1枚举(因为height[i]之前已经计算过了),然后对于这样的每个前缀看一看上下能够分别延伸到哪里。
我不会分析复杂度,但是这个算法还是能跑得过得。
Notice
开始想了一个复杂度低但是错误的算法,然后思路就被局限住了。所以,以后想不到好的算法的时候一定要先想一个最暴力的暴力,说不定就过了呢。。。
Code
#include <algorithm>
#include <cstdio>
#include <cstring>
const int maxn = 3010;
int a[maxn], sa[2][maxn], rank[2][maxn], height[maxn];
int n, p, q, k, K;
char str[maxn];
int v[maxn];
void getsa(int sa[maxn], int rank[maxn], int Sa[maxn], int Rank[maxn]) {
for (int i = 1; i <= n; i++)
v[rank[sa[i]]] = i;
for (int i = n; i >= 1; i--)
if (sa[i] > k)
Sa[v[rank[sa[i] - k]]--] = sa[i] - k;
for (int i = n - k + 1; i <= n; i++)
Sa[v[rank[i]]--] = i;
for (int i = 1; i <= n; i++)
Rank[Sa[i]] = Rank[Sa[i - 1]] + (rank[Sa[i - 1]] != rank[Sa[i]] ||
rank[Sa[i - 1] + k] != rank[Sa[i] + k]);
}
void getheight(int sa[maxn], int rank[maxn]) {
int i, k = 0;
for (i = 1; i <= n; height[rank[i++]] = k) {
if (k)
k--;
int j = sa[rank[i] - 1];
while (a[i + k] == a[j + k])
k++;
}
}
void da() {
p = 0, q = 1, k = 1;
for (int i = 1; i <= n; i++)
v[a[i]]++;
for (int i = 1; i <= 2; i++)
v[i] += v[i - 1];
for (int i = 1; i <= n; i++)
sa[p][v[a[i]]--] = i;
for (int i = 1; i <= n; i++)
rank[p][sa[p][i]] =
rank[p][sa[p][i - 1]] + (a[sa[p][i - 1]] != a[sa[p][i]]);
while (k < n) {
getsa(sa[p], rank[p], sa[q], rank[q]);
p ^= 1;
q ^= 1;
k <<= 1;
}
getheight(sa[p], rank[p]);
}
void solve() {
for (int i = 1; i <= n; i++) {
for (int j = height[i] + 1; sa[p][i] + j - 1 <= n; j++) {
int l, r;
for (l = i; l >= 1 && height[l] >= j; l--)
;
for (r = i + 1; r <= n && height[r] >= j; r++)
;
if (r - l > 1)
printf("%d\n", r - l);
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input", "r", stdin);
#endif
scanf("%d %s", &n, str + 1);
for (int i = 1; i <= n; i++)
a[i] = str[i] - '0';
a[0] = 3;
for (int i = n + 1; i < maxn; i++)
a[i] = 3;
da();
solve();
}
[bzoj2251][2010Beijing Wc]外星联络——后缀数组+暴力求解的更多相关文章
- BZOJ2251 [2010Beijing Wc]外星联络 后缀数组 + Height数组
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin ...
- 【BZOJ2251】[2010Beijing Wc]外星联络 后缀数组
[BZOJ2251][2010Beijing Wc]外星联络 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻找外星人的事业.于是, ...
- bzoj 2251: [2010Beijing Wc]外星联络 后缀数组
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 424 Solved: 232[Submit][ ...
- 【BZOJ-2251】外星联络 后缀数组 + 暴力
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 670 Solved: 392[Submit][ ...
- [bzoj2251][2010BeiJing Wc]外星联络_后缀数组
外星联络 bzoj-2251 2010-BeiJing Wc 题目大意:题目链接. 注释:略. 想法: 这咋做啊????一看数据范围才$3\cdot 10^3$. 建立后缀数组. 所以我们将所有后缀排 ...
- bzoj2251 [2010Beijing Wc]外星联络
因为n很小,所以对于串s的每一个后缀,都把其加入字典树中,并且经过一个字典树节点,该节点权值就+1. 输出时因为要字典序最小,所以字典树先走0分叉,再走1分叉,如果节点权值大于等于2就输出 代码 #i ...
- BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组
BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的 ...
- 2251: [2010Beijing Wc]外星联络
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 801 Solved: 481[Submit][ ...
- BZOJ 2251: [2010Beijing Wc]外星联络
2251: [2010Beijing Wc]外星联络 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 795 Solved: 477[Submit][ ...
随机推荐
- Delphi实例之一个简易的浏览器的实现
Delphi实例之一个简易的浏览器的实现 Delphi7的WebBrowser组件提供了很多不错的网页设计的功能,下面做一个简单的浏览器.组件很简单按照下面摆放就行了. 这是运行后的效果 源代码 主页 ...
- 【APUE】Chapter4 File and Directories
4.1 Introduction unix的文件.目录都被当成文件来看待(vi也可以编辑目录):我猜这样把一起内容都当成文件的原因是便于统一管理权限这类的内容 4.2 stat, fstat, fst ...
- Linux-Shell脚本编程-学习-6-Shell编程-使用结构化命令-文件比较-case编程
这一片主要说test文件的比较,文件比较在日常使用的频率比较高,这里重点把每个部分都试着说说看 1. 检车目录 -d -d测试会检查指定的文件名是否在系统上以目录的形式存在,当我们要写文件到某个目录之 ...
- Python 3基础教程32-正则
本文介绍Python的正则,通过本文介绍和一个练习,对正则有一个基本了解就可以. # 正则表达式 ''' 正则表达式是有一些特殊字符组成,能够帮你找到一些符合一定规则的字符串 先来了解几个符号所代表的 ...
- 问题 C: 质因数的个数
1947: 质因数的个数 时间限制: 1 Sec 内存限制: 32 MB提交: 245 解决: 114[提交][状态][讨论版][命题人:外部导入] 题目描述 求正整数N(N>1)的质因数的 ...
- LeetCode - 1. Two Sum(8ms)
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- UGUI 代码 动态添加 Event Trigger 的事件
Additionally, if you need more than just the events provided by default, I'd suggest instead attachi ...
- java正则表达式 1 -- 符号
正则表达式主要是用于操作字符串的规则 1 首先体验一下正则表达式: 需求:某个串只能是数字 传统方法: public class Demo2{ public static void main(Stri ...
- 通过NTP(Network Time Protocal)协议进行时间同步
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwUAAAKOCAYAAAD3ZbXWAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjw
- TCP/IP Note2
TCP/IP寻址 TCP/IP使用32个比特或者4个0到255之间的数字来为计算机编址. 1. IP地址 每个计算机必须有一个IP地址才能够连入Internet中. 每个IP包必须有一个地址才能够发送 ...