Cod sursa(job #1581419)

Utilizator killer301Ioan Andrei Nicolae killer301 Data 26 ianuarie 2016 19:59:44
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.35 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int nmax =  16384;
const int maxlg = 17;

struct entry
{
	int nr[2], pos;
	bool operator== (const entry &other)
	{
		return nr[0] == other.nr[0] && nr[1] == other.nr[1];
	}
};

entry L[nmax+5];

int n, lg;
char a[nmax+5];
int dp[maxlg][nmax+5];

bool cmp(entry a, entry b)
{
	return a.nr[0] < b.nr[0] || (a.nr[0] == b.nr[0] && a.nr[1] < b.nr[1]);
}

int lcp(int x, int y)
{
	int ans = 0;
	if(x==y)return n-x;
	for(int k=lg-1; k>=0 && x<n && y<n; k --)
		if(dp[k][x] == dp[k][y])
		{
			x+=1<<k;
			y+=1<<k;
			ans+=1<<k;
		}
	return ans;
}

int main()
{
	freopen("substr.in", "r", stdin);
	freopen("substr.out", "w", stdout);
	int k;
	scanf("%d%d", &n, &k);
	scanf("%s", a);
	for(int i=0; i<n; i++)
		dp[0][i] = a[i]-'a';
	for(int k=1; (1<<(k-1)) < n; k++)
	{
		lg = k;
		for(int i=0; i<n; i++)
		{
			L[i].nr[0] = dp[k-1][i];
			if(i+(1<<(k-1)) < n)L[i].nr[1] = dp[k-1][i+(1<<(k-1))];
			else L[i].nr[1] = -1;
			L[i].pos = i;
		}
		sort(L, L + n, cmp);
		for(int i=0; i<n; i++)
		{
			if(i>0 && L[i] == L[i-1]) dp[k][L[i].pos] = dp[k][L[i-1].pos];
			else dp[k][L[i].pos] = i;
		}
	}
	int Max = -1;
	for(int i=0; i<=n-k; i++)
        Max = max(Max, lcp(L[i].pos, L[i+k-1].pos));
	printf("%d\n", Max);
	return 0;
}