SAM
2016-02-24 19:49
253 查看
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; inline LL C2(LL x){ return (x * (x - 1)) >> 1; } const int ALB = 26; const int MAXN =1000005; int N; int arr[MAXN]; char str[MAXN]; struct NODE{ NODE *par, *go[ALB]; int val; int cnt; int size; NODE(int val):par(NULL),val(val),size(1){ cnt=-1; fill_n(go, ALB, (NODE*)NULL); } NODE(){}; }node[MAXN<<1], *last,*root,*no; int ncnt; void Init(){ ncnt = 1; root=&node[0]; *root=NODE(0); last=root; } void Append(int x){ NODE *p = last, *np = &node[ncnt ++]; *np = NODE(p->val + 1); for(; p && !p->go[x]; p = p->par)p->go[x] = np; if(p){ NODE *q = p->go[x]; if(p->val + 1 == q->val){ np->par = q; } else{ NODE *nq = &node[ncnt ++]; *nq = *q; nq->size = 0; nq->val = p->val + 1; q->par = nq; np->par = nq; for(; p && p->go[x] == q; p = p->par) p->go[x] = nq; } } else{ np->par = root; } last = np; } void Deal(){ int i; NODE *cur, *p; static int c[MAXN]; static NODE* top[MAXN<<1]; for(i = 0; i < ncnt; i ++) c[node[i].val] ++; for(i = 1; i <= N; i ++) c[i] += c[i - 1]; for(i = 0; i < ncnt; i ++) top[-- c[node[i].val]] = &node[i]; for(i = ncnt - 1; i > 0; i --){ cur = top[i]; p = cur->par; p->size += cur->size; } }
相关文章推荐
- messenger跨进程通信出现ClassNotFoundException...
- 浏览器缓存-控制刷新-cdn问题
- poj 3254 Corn Fields 状压dp入门题
- 工作技巧总结(进行中...)
- 一起学习unix环境高级编程--unix基础知识(1)
- 以太坊本地私有链开发环境搭建
- [leetcode] add digit
- hdu 3037 Saving Beans lucas定理
- POJ - 2388 Who's in the Middle
- C语言经典书籍
- 网络的最大流最小割定理
- Android的消息循环机制 Looper Handler类分析
- 模板_树链剖分
- yii2的安装使用
- 堆 (heap)
- Android样式的开发:Style篇
- 网页元素
- BZOJ_P1036&Codevs_P2460 [ZJOI2008]树的统计Count(树链剖分)
- Linux文件与目录控制函数讲解
- PAT-1018 锤子剪刀布