记录编号 |
162530 |
评测结果 |
AAAAAAAAAAAAAA |
题目名称 |
隐藏口令 |
最终得分 |
100 |
用户昵称 |
天一阁 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.206 s |
提交时间 |
2015-05-17 17:21:39 |
内存使用 |
44.95 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 400010
#define A 26
using namespace std;
void file(){
freopen("hidden.in","r",stdin);
freopen("hidden.out","w",stdout);
}
namespace SAM{
struct node{
node *ch[A],*fa;
int len,pos;
}*root,*last,spT[N];
int tot;
void init(){
// memset(spT,0,sizeof(spT));
root=&spT[tot=0];
last=root;
}
void addin(char c){
int t=c-'a';
node *np=&spT[++tot],*p=last;
np->len=last->len+1;
last=np;
np->pos=np->len;
for(;p&&!p->ch[t];p=p->fa) p->ch[t]=np;
if(!p) np->fa=root;
else{
if(p->len+1==p->ch[t]->len) np->fa=p->ch[t];
else{
node *nq=&spT[++tot],*q=p->ch[t];
*nq=*q;
q->fa=np->fa=nq;
nq->len=p->len+1;
nq->pos=np->len;
for(;p&&p->ch[t]==q;p=p->fa)
p->ch[t]=nq;
}
}
}
void ask(int n){
node *p=root;
for(int i=1;i<=n;i++)
for(int t=0;t<A;t++)
if(p->ch[t]){p=p->ch[t];break;}
printf("%d\n",p->pos-n);
}
}
int n;
char S[N];
int main(){
file();
int len=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
static char ch;
while(!isalpha(ch=getchar()));
S[len++]=ch;
}
SAM::init();
for(int i=0;i<2*n;i++) SAM::addin(S[i%n]);
SAM::ask(n);
return 0;
}