Cod sursa(job #2347744)

Utilizator mirceaisherebina mircea mirceaishere Data 19 februarie 2019 07:58:12
Problema Substr Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <algorithm>
#define v1 first.first
#define v2 first.second
#define poz second
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");

int n,k,i,j,v[16400],p[15][16400],e,lung,sol;
char s[16400];
pair< pair<int,int>, int> L[16400];

int lcp(int i, int j) {
	int f=e;
	int putere=(1<<e);
	int sol=0;
	while (putere){
		if (p[f][i]==p[f][j]) {
			sol+=putere;
			i+=putere;
			j+=putere;
		}
		f--;
		putere/=2;
	}
	return sol;
}

int main() {
	fin>>n>>k;
	fin>>s;
    if (k==1) {
        fout<<n;
        return 0;
    }
	for (i=0; i<n; i++){
		p[0][i]=s[i]-'0';
	}
	for(e=0, lung=1; lung<=n; e++, lung*=2) {
		for(i=0; i<n; i++) {
			L[i].v1=p[e][i];
			if(i+lung<n)
				L[i].v2=p[e][i+lung];
			else{
				L[i].v2=-1;
			}
			L[i].poz=i;
		}
		sort(L, L+n);
		p[e+1][L[0].poz]=0;
		for (i=1;i<n;i++){
			if (L[i].v1==L[i-1].v1 && L[i].v2==L[i-1].v2){
				p[e+1][L[i].poz]=p[e+1][L[i-1].poz];
			}else{
				p[e+1][L[i].poz]=p[e+1][L[i-1].poz]+1;
			}

		}
	}
	for (i=0;i<n;i++){
		v[p[e][i]]=i;
	}
	for (i=0; i+k-1<n; i++){
		sol=max(sol, lcp(v[i],v[i+k-1]));
	}
	fout<<sol;
	return 0;
}