Cod sursa(job #2340072)

Utilizator danielsociuSociu Daniel danielsociu Data 9 februarie 2019 19:09:36
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <bits/stdc++.h>
using namespace std;
#define maxn 17000
#define f first
#define s second

int n,k,e;
int rmq[18][maxn],sol[maxn],ans;
pair<pair<int,int>,int> L[maxn];

int lcp(int st,int dr){
	int pow=(1<<e),ans=0,f=e;
	while(pow!=0){
		if(rmq[f][st]==rmq[f][dr])
			st+=pow,dr+=pow,ans+=pow;
		pow>>=1;
		--f;
	}
	return ans;
}

int main()
{
	freopen("substr.in","r",stdin);
	freopen("substr.out","w",stdout);

	char x;
	int i,len;

	cin>>n>>k;
	if(k==1) {cout<<n;return 0;}
	for(i=0;i<n;++i){
		cin>>x;
		rmq[0][i]=x-'a';
	}
	for(e=0,len=1;len<=n;++e,len*=2){
		for(i=0;i<n;++i){
			L[i].f.f=rmq[e][i];
			L[i].f.s=((i+len<n)?rmq[e][i+len]:-1);
			L[i].s=i;
		}
		sort(L,L+n);
		rmq[e+1][L[0].s]=0;
		for(i=1;i<n;++i)
			if(L[i-1].f.f==L[i].f.f&&L[i-1].f.s==L[i].f.s)
				rmq[e+1][L[i].s]= rmq[e+1][L[i-1].s];
			else
				rmq[e+1][L[i].s]= rmq[e+1][L[i-1].s] +1;
	}
	for(i=0;i<n;++i)
		sol[rmq[e][i]]=i;

	for(i=0;i+k-1<n;++i)
		ans=max(ans,lcp(sol[i],sol[i+k-1]));
	cout<<ans;
}