Cod sursa(job #1007036)

Utilizator otilia_sOtilia Stretcu otilia_s Data 8 octombrie 2013 00:58:44
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int MAXN = 16385; 
const int MAXLG = 16;

struct elem {
	int nr[2], poz;
} L[MAXN];

int N, K, st, order[MAXN];
int P[MAXLG][MAXN];
char s[MAXN];

void read()
{
	freopen("substr.in","r",stdin);
	scanf("%d %d\n", &N, &K);
	scanf("%s", &s);
}

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

bool cmp2(const int& i1, const int& i2) 
{
	return P[st][i1] < P[st][i2];
}

void suffix_array()
{
	for (int i = 0; i < N; ++i) 
		P[0][i] = s[i] - 'a';
	
	int cnt;
	for (st = 1, cnt = 1; cnt >> 1 < N; ++st, cnt <<= 1) {
		for (int i = 0; i < N; ++i) {
			L[i].nr[0] = P[st - 1][i];
			L[i].nr[1] = i + cnt < N ? P[st - 1][i + cnt] : -1;
			L[i].poz = i;
		}
		
		sort(L, L + N, cmp);
	
		for (int i = 0; i < N; ++i) 
			P[st][L[i].poz] = (i > 0 && L[i].nr[0] == L[i-1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[st][L[i-1].poz] : i);	
	}
}

int LCP(int x, int y)
{
    int ret = 0, k;
    if (x == y) return N - x;
    for (k = st; k >= 0; --k) {
        if (P[k][x] == P[k][y])
            ret += 1 << k,
            x += 1 << k,
            y += 1 << k;
    }
    return ret;
}

int main()
{
	read();
	suffix_array();
	
	st--;
	for (int i = 0; i < N; ++i)
		order[i] = i;
	sort(order, order + N, cmp2);
	
	int sol = 0;
	for (int i = 0; i < N - K; ++i) {
		sol = max(sol, LCP(order[i], order[i + K - 1]));
	}
	
	freopen("substr.out","w",stdout);
	printf("%d\n", sol);
	
	return 0;
}