Cod sursa(job #545001)

Utilizator mottyMatei-Dan Epure motty Data 2 martie 2011 16:16:20
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 16388, logN = 15;

int n, k, line;
int lcp[logN][N];
char text[N];

vector < pair< int,pair<int,int> > > vFind;

void Read()
{
	scanf("%d%d\n",&n,&k);
	
	gets(text);
}

int Compare( pair< int,pair<int,int> > a, pair< int,pair<int,int> > b)
{
	if (a.second.first == b.second.first)
		return a.second.second < b.second.second;
	
	return a.second.first < b.second.first;
}

void GetCurrentLCP(int curLine)
{
	int count = 1;
	
	lcp[curLine][vFind[0].first] = 1;
	
	for (int i = 1; i<n; ++i)
	{
		if ( (vFind[i].second.first != vFind[i-1].second.first) || (vFind[i].second.second != vFind[i-1].second.second) )
			++count;
		
		lcp[curLine][vFind[i].first] = count;
	}
}

void GenerateLCP()
{
	for (int i = 0; i < n; ++i)
		lcp[0][i] = text[i];
	
	int put;
	
	for (line = 1, put = 2; put < n; ++line, put <<= 1)
	{
		for (int i = 0; i < n; ++i)
		{
			pair <int,int> a;
			a.first = lcp[line-1][i];
			a.second = lcp[line-1][i + (put/2)];
			
			vFind.push_back(make_pair(i, a));
		}
		
		sort(vFind.begin(), vFind.end(), Compare);
		GetCurrentLCP(line);
		
		vFind.clear();
	}
	
	line--;
}

int GetLCP(int i, int j)
{
	int result = 0;
	
	for (int curLine = line; curLine >= 0 && i < n && j < n; --curLine)
		if (lcp[curLine][i] == lcp[curLine][j])
		{
			int put = 1 << curLine;
			i += put;
			j += put;
			result += put;
		}
	
	return result;
}

void GetAnswer()
{
	int rAct, result = 0;
	
	for (int i = 0; i <= n-k; ++i)
	{
		rAct = GetLCP(i, i+k-1);
		
		if (rAct > result)
			result = rAct;
	}
	
	printf("%d\n",result);
}

int main()
{
	freopen("substr.in","r",stdin);
	freopen("substr.out","w",stdout);
	
	Read();
	GenerateLCP();
	GetAnswer();
	
	return 0;
}