您的位置:首页 > 其它

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: