记录编号 162592 评测结果 AAAAAAAAAAA
题目名称 [USACO Dec06]产奶的模式 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.017 s
提交时间 2015-05-18 06:38:07 内存使用 1.03 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>

#define N 40010

using namespace std;

void file(){
	freopen("patterns.in","r",stdin);
	freopen("patterns.out","w",stdout);
}

namespace SAM{
	struct node{
		node* ch[27];
		node *fa;
		int len,R,maxv;
	}*last,*root,spT[N],*b[N];
	
	int f[N],tot,cnt[N];
	
	void init(){
		root=&spT[++tot];
		last=root;
	}
	
	void topsort(int n){
		for(int i=1;i<=tot;i++) cnt[spT[i].len]++;
		for(int i=1;i<=n;i++) cnt[i]+=cnt[i-1];
		for(int i=1;i<=tot;i++) b[cnt[spT[i].len]--]=&spT[i];
	}
	
	void addin(int t){
		node *np=&spT[++tot],*now=last;
		np->len=last->len+1;
		last=np;
		for(;now&&!now->ch[t];now=now->fa) now->ch[t]=np;
		if(!now) np->fa=root;
		else if(now->len+1==now->ch[t]->len)
			np->fa=now->ch[t];
		else{
			node *nq=&spT[++tot],*q=now->ch[t];
			*nq=*q;
			nq->len=now->len+1;
			np->fa=q->fa=nq;
			for(;now&&now->ch[t]==q;now=now->fa)
				now->ch[t]=nq;
		}
	}
	
	void ask(int *S,int n,int K){
		node* p=root;
		for(int i=0;i<n;i++){
			p=p->ch[S[i]];
			p->R++;
		}
		for(int i=tot;i>=1;i--){
			node* tmp=b[i];
			f[tmp->len]=max(f[tmp->len],tmp->R);
			if(tmp->fa) tmp->fa->R+=tmp->R;
		}
		for(int i=n;i>=1;i--) f[i]=max(f[i],f[i+1]);
		int ans=0;
		for(int i=1;i<=n;i++) if(f[i]>=K) ans=i;
		printf("%d\n",ans);
	}
}

int S[N],n,K;

int main(){
	file();
	scanf("%d%d",&n,&K);
	for(int i=0;i<n;i++) scanf("%d",&S[i]);
	SAM::init();
	for(int i=0;i<n;i++) SAM::addin(S[i]);
	SAM::topsort(n);
	SAM::ask(S,n,K);
	fclose(stdin);
	fclose(stdout);
	return 0;
}