#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10;
struct Node{
Node *pre,*go[26];
int step;
int num;
void clear(){
memset(go,0,sizeof(go));num=0;pre=0;step=0;
}
};
Node Pool[N*2],*cur,*root,*last;
void init(){
cur=Pool;
root=last=cur++;
root->clear();
}
void Insert(int w){
Node *p=last;
Node *np=cur++;
np->clear();np->step=p->step+1;np->num=1;
while(p&&!p->go[w]){
p->go[w]=np,p=p->pre;
}
if(p==0){
np->pre=root;
}
else {
Node *q=p->go[w];
if(p->step+1==q->step){
np->pre=q;
}
else {
Node *nq=cur++;
nq->clear();
memcpy(nq->go,q->go,sizeof(q->go));
nq->step=p->step+1;
q->pre=nq;
while(p&&p->go[w]==q){
p->go[w]=nq;p=p->pre;
}
np->pre=nq;
}
}
last=np;
}
void debug(){
for(Node *i=root;i!=cur;i++){
for(int j=0;j<26;j++)if(i->go[j]){
printf("%d %c %d\n",i-root,j+'a',i->go[j]-root);
}
}
for(Node *i=root;i!=cur;i++){
printf("%d %d\n",i-root,i->pre-root);
}
}
int cnt[N];
Node *B[N*2];
void build(char *ss){
int n=strlen(ss);
init();
for(int i=0;i<n;i++){
Insert(ss[i]-'a');
}
memset(cnt,0,sizeof(cnt));
for(Node *i=Pool;i!=cur;i++){
cnt[i->step]++;
}
for(int i=1;i<=n;i++)cnt[i]+=cnt[i-1];
for(Node *i=Pool;i!=cur;i++){
B[--cnt[i->step]]=i;
}
for(int i=cur-Pool-1;i>1;i--){
B[i]->pre->num+=B[i]->num;
}
}
int main(){
return 0;
}
后缀自动机
最新推荐文章于 2024-08-03 17:41:27 发布