Cod sursa(job #2548087)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 16 februarie 2020 10:54:04
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>


using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
char s[51002];
int a[51000],p[20][51000];
long long p2,n,i,j,k,ss;
bool comp(int x,int y)
{
	if(p[i - 1][x] != p[i - 1][y])
		return p[i - 1][x] < p[i - 1][y];
	if(x + p2 > n)
		return 1;
	if(y + p2 > n)
		return 0;
	return p[i - 1][x + p2] < p[i - 1][y + p2];
}
int com(int x,int y)
{
	int l = 0,z;
	for(z = i; z >= 0 && x <= n && y <= n; --z)
		if(p[z][x] == p[z][y])
		{
			l += 1 << z;
			x += 1 << z;
			y += 1 << z;
		}
	return l;
}
int main()
{
    f >> n >> k;
    if(k == 1)
    {
        g << n;
        return 0;
    }
    f.get();
	f.getline(s + 1,51000);
	//g << (s + 1);
	//g << '\n';
	n = strlen(s + 1);
	for(i = 1; i <= n; ++i)
	{
		a[i] = i;
		p[0][i] = s[i] - '0';
	}
	for(i = p2 = 1; p2 <= n; ++i)
	{
		sort(a + 1,a + n + 1,comp);
		for(j = 1,ss = 0; j <= n; ++j)
		{
			if(a[j] + p2 <= n && a[j - 1] + p2 <= n && p[i - 1][a[j]] == p[i - 1][a[j - 1]] && p[i - 1][a[j] + p2] == p[i - 1][a[j - 1] + p2])
				ss++;
			p[i][a[j]] = j - ss;
		}
		p2 = (1 << i);
	}
	i--;
	int rasp = 0;
	int in = 1;
	int sf = n;
	while(in <= sf)
	{
		int mij = (in + sf) / 2;
		int ap = 1;
		for(int i = 2; i <= n; ++i)
		{
			if(com(a[i],a[i - 1]) >= mij)
				ap++;
			else
				ap = 1;
			if(ap >= k)
			{
				in = mij + 1;
				rasp = mij;
				break;
			}
		}
		if(rasp != mij)
            sf = mij - 1;
	}
	g << rasp;
	return 0;
}