【SPOJ-DISUBSTR】Distinct Substrings【后缀数组】
2016-02-10 11:02
429 查看
似乎还是例题?
求不同子串的个数。
用总的子串减去重复子串,总的子串个数为n * (n + 1) / 2,重复子串个数就是height的和。
Q:为什么不用std::string了?
A:因为spoj太慢了太慢了太慢了太慢了太慢了
(cnt又开小了,RE一次)
求不同子串的个数。
用总的子串减去重复子串,总的子串个数为n * (n + 1) / 2,重复子串个数就是height的和。
Q:为什么不用std::string了?
A:因为spoj太慢了太慢了太慢了太慢了太慢了
(cnt又开小了,RE一次)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1005, maxm = 1005, M = 300; int sa[maxn], rank[maxn], height[maxn]; int wa[maxn], wb[maxn], wv[maxn], cnt[maxm]; void SA(int *r, int n, int m) { int *x = wa, *y = wb; for(int i = 0; i < m; i++) cnt[i] = 0; for(int i = 0; i < n; i++) cnt[x[i] = r[i]]++; for(int i = 1; i < m; i++) cnt[i] += cnt[i - 1]; for(int i = n - 1; i >= 0; i--) sa[--cnt[x[i]]] = i; for(int j = 1; j < n; j <<= 1) { int p = 0; for(int i = n - j; i < n; i++) y[p++] = i; for(int i = 0; i < n; i++) if(sa[i] >= j) y[p++] = sa[i] - j; for(int i = 0; i < n; i++) wv[i] = x[y[i]]; for(int i = 0; i < m; i++) cnt[i] = 0; for(int i = 0; i < n; i++) cnt[wv[i]]++; for(int i = 1; i < m; i++) cnt[i] += cnt[i - 1]; for(int i = n - 1; i >= 0; i--) sa[--cnt[wv[i]]] = y[i]; swap(x, y); p = 1; x[sa[0]] = 0; for(int i = 1; i < n; i++) x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + j] == y[sa[i] + j] ? p - 1 : p++; if(p >= n) break; m = p; } } void calcHeight(int *r, int n) { int i, j, k; for(i = j = k = 0; i < n; height[rank[i++]] = k) for(k ? k-- : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; k++); } int n, s[maxn]; char str[maxn]; int main() { int T; scanf("%d", &T); while(T--) { scanf("%s", str); n = strlen(str); for(int i = 0; i < n; i++) s[i] = str[i]; s = 0; SA(s, n + 1, M); for(int i = 0; i <= n; i++) rank[sa[i]] = i; calcHeight(s, n); int ans = n * (n + 1) / 2; for(int i = 1; i <= n; i++) ans -= height[i]; printf("%d\n", ans); } return 0; }
相关文章推荐
- 程序员修炼之路
- 算法训练 操作格子
- LVS-NAT配置
- 快速进入开发
- Java 方法参数的值传递和引用传递
- LVS-DR配置
- python核心编程-第六章习题答案
- VMware存储栈那点儿事儿
- nyoj 12(区间覆盖)
- 高可用集群HA(heartbeat)
- 操作SQL构件的SQL生成
- spring(DI) 懒加载的执行顺序、通过构造函数给属性赋值
- 《C陷阱与缺陷》整理二
- 第六章函数
- 日志系统重构之多源聚合的采集器
- android开发周刊
- 2016 年,科技界即将出现的大事实力分析预测!
- u-boot-2016.01移植笔记之支持dm9000
- 模板方法模式——封装固定流程
- Java is Pass-by-Value, Dammit! 我靠!Java就是值传递!