Cod sursa(job #2692298)

Utilizator BogdanTicuTicu Bogdan Valeriu BogdanTicu Data 2 ianuarie 2021 10:31:44
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("substr.in");
ofstream out("substr.out");

int lg2[20005],mat[25][20005],sufix[20005];
string s;
int n,k;
pair<pair<int,int>,int> key[20005];
int lcp(int a,int b)
{
	int rez=0;
	int point=n-max(a,b)+1;
	for(int i=lg2[point];i>=0;i--)
	{
		if(mat[i][a]==mat[i][b])
		{
			rez+=(1<<i);
			a+=(1<<i);
			b+=(1<<i);
		}
	}
	return rez;
}


void sufixx_arry()
{
	for(int i=1;i<=n;i++)
		mat[0][i]=s[i];
	for(int i=1;i<=lg2[n]+1;i++)
	{
		for(int j=1;j<=n;j++)
			key[j]={{mat[i-1][j],mat[i-1][j+(1<<(i-1))]},j};
		sort(key+1,key+n+1);
		int ct=0;
		for(int j=1;j<=n;j++)
		{
			if(key[j].first!=key[j-1].first)
				ct++;
			mat[i][key[j].second]=ct;
		}
	}
}


int main()
{
	in>>n>>k;
	for(int i=1;i<=n;i++)
		lg2[i]=lg2[i/2]+1;
	in>>s;
	s='#'+s;
	if(k==1) 
	{
		out<<n<<"\n"; 
		return 0;
	}
	sufixx_arry();
	for(int i=1;i<=n;i++)
		sufix[mat[lg2[n]+1][i]]=i;
	int ans=0;
	for(int i=1;i<=n;i++)
		ans=max(ans,lcp(sufix[i],sufix[i+k-1]));
	out<<ans;
	return 0;
}