萌新刚学OI,求助大佬
查看原帖
萌新刚学OI,求助大佬
125454
CLCA_楼主2020/8/12 14:27

Rt,SAM写挂了。板子题有人帮忙看下吧。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 50005
using namespace std;
struct SAM{
	int fa[N],len[N],idx,pre,sz[N];
	map<int,int>nxt[N];
	SAM(){fa[0]=~0;idx=pre=len[0]=0;}
	void extend(int ch){
		int cur=++idx,p=pre;len[cur]=len[pre]+1;
		while(~p&&!nxt[p][ch])nxt[p][ch]=cur,p=fa[p];
		if(p==-1)fa[cur]=0;
		else{
			int q=nxt[p][ch];
			if(len[p]+1==len[q])fa[cur]=q;
			else{
				int now=++idx;len[now]=len[p]+1;
				nxt[now]=nxt[q],fa[now]=fa[q],fa[q]=fa[cur]=now;
				while(~p&&nxt[p][ch]==q)nxt[p][ch]=now;
			}
		}sz[pre=cur]=1;
	}
	int c[N],b[N];
	void init(){
		rep(i,1,idx)c[len[i]]++;
		rep(i,1,idx)c[i]+=c[i-1];
		rep(i,1,idx)b[c[len[i]]--]=i;
		pre(i,idx,1)sz[fa[b[i]]]+=sz[b[i]];
	}
	int solve(int k){
		int ans=0;
		rep(i,1,idx)if(sz[i]>=k)ans=max(ans,len[i]);
		return ans;
	}
}w;
int main(){
//freopen("input","r",stdin);
	int n,k;
	scanf("%d%d",&n,&k);
	rep(i,1,n){
		int x;scanf("%d",&x);
		//if(x!=1)printf("ss %d %d\n",i,x);
		w.extend(x);
	}
	w.init();
	printf("%d\n",w.solve(k));
	return 0;
}
/*
g++ 2851.cpp -o a -Wall -std=c++11
*/
2020/8/12 14:27
加载中...