UVALive 6869(后缀数组)
题意:给定一个字符串,求至少重复一次的不同子串个数。
分析:模拟写出子符串后缀并排好序可以发现,每次出现新的重复子串个数都是由现在的height值减去前一个height值。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = ;
typedef long long LL;
int sa[maxn];
int t1[maxn], t2[maxn], c[maxn];
int ran[maxn], height[maxn];
int s[maxn];
char str[maxn]; void build_sa(int s[], int n, int m) {
int i, j, p, *x = t1, *y = t2;
for (i = ; i < m; i++) c[i] = ;
for (i = ; i < n; i++) c[x[i] = s[i]]++;
for (i = ; i < m; i++) c[i] += c[i-];
for (i = n-; i >= ; i--) sa[--c[x[i]]] = i; for (j = ; j <= n; j <<= ) {
p = ;
for (i = n-j; i < n; i++) y[p++] = i;
for (i = ; i < n; i++)
if (sa[i] >= j)
y[p++] = sa[i] - j;
for (i = ; i < m; i++) c[i] = ;
for (i = ; i < n; i++) c[x[y[i]]]++;
for (i = ; i < m; i++) c[i] += c[i-];
for (i = n-; i >= ; i--) sa[--c[x[y[i]]]] = y[i]; swap(x, y);
p = , x[sa[]] = ;
for (i = ; i < n; i++)
x[sa[i]] = y[sa[i-]] == y[sa[i]] && y[sa[i-]+j] == y[sa[i]+j] ? p- : p++; if (p >= n) break;
m = p;
}
} void getHeight(int s[],int n) {
int i, j, k = ;
for (i = ; i <= n; i++)
ran[sa[i]] = i;
for (i = ; i < n; i++) {
if (k) k--;
j = sa[ran[i]-];
while (s[i+k] == s[j+k]) k++;
height[ran[i]]=k;
}
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%s", str);
int n = strlen(str);
for (int i = ; i <= n; i++)
s[i] = str[i];
build_sa(s, n+, );
getHeight(s, n);
LL ans = ;
for (int i = ; i <= n; i++)
{
if(height[i]>height[i-])ans+=height[i]-height[i-];
}
printf("%lld\n", ans);
}
return ;
}
UVALive 6869(后缀数组)的更多相关文章
- UVALive - 6869 Repeated Substrings 后缀数组
题目链接: http://acm.hust.edu.cn/vjudge/problem/113725 Repeated Substrings Time Limit: 3000MS 样例 sample ...
- UVALive - 4513 Stammering Aliens ——(hash+二分 || 后缀数组加二分)
题意:找一个出现了m次的最长子串,以及这时的最右的位置. hash的话代码还是比较好写的,,但是时间比SA多很多.. #include <stdio.h> #include <alg ...
- UVALive - 6856 Circle of digits 后缀数组+二分
题目链接: http://acm.hust.edu.cn/vjudge/problem/82135 Circle of digits Time Limit: 3000MS 题意 把循环串分割成k块,让 ...
- 后缀数组的倍增算法(Prefix Doubling)
后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- POJ1743 Musical Theme [后缀数组]
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 27539 Accepted: 9290 De ...
- 后缀数组(suffix array)详解
写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
随机推荐
- HNCU1741:算法3-2:行编辑程序
http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1741 题目描述 一个简单的行编辑程序的功 ...
- android压缩解压zip文件
网上各种方法的收集: 1.上次写了个解压缩功能,但有局限性,比如压缩文件xx.zip 里包括子目录的情况下,执行上次解压缩的功能就不能实现我们想要的效果,于是在网上参考了一下java的解压缩功能.对上 ...
- 基于visual Studio2013解决C语言竞赛题之1028平均值
题目 解决代码及点评 /* 已知有9个数,请求出这些数中的最大值.最小值及平均值,以及有多少个数等于平均值? */ #include<stdio.h> ...
- 杭电ACM1408——盐水的故事
简单的题目,RT,就能够写出代码.须要注意的是类型的应用,应该用浮点型. 以下的是AC的代码: #include <iostream> using namespace std; int m ...
- Study notes for B-tree and R-tree
B-tree B-tree is a tree data structure that keeps data sorted and allows searches, sequential access ...
- ASP.NET - 后台获取按钮绑定的值CommandArgument
<asp:LinkButton runat="server" ID="resumelbtn" CommandArgument='<%# Eval(& ...
- 基于visual Studio2013解决C语言竞赛题之1056素数序列
题目 解决代码及点评 /* 56. 编程序求3至39之间满足下列条件的各组素数:每组有3个素数,第2个比第一个大2,第3个比第2个大4.例如 5,7,11就是满足条件的一组. 要求: ...
- MFC为应用程序添加托盘(右键托盘,弹出菜单)
源代码:http://download.csdn.net/detail/nuptboyzhb/4137784 1. 导入一个托盘图标的资源(.ico)格式:资源ID为IDI_ICON1 2 ...
- 【Demo 0009】Android 组件(BroadcastReceiver)
本章学习要点: 1. 了解Broadcast的作用; 2. 掌握自定义广播和系统广播的接收: 3. 掌握广播的发送:
- error -27257: Pending web_reg_save_param/reg_find/create_html_param[_ex] request(s) detected and reset at the end of iteration number 1
检查点函数 web_reg_find("Search=body", "savecount=num", "Text=test1&quo ...