记录编号 162530 评测结果 AAAAAAAAAAAAAA
题目名称 隐藏口令 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 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;
}