Cod sursa(job #2544094)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 11 februarie 2020 19:23:49
Problema Substr Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
//-----------------------------------------------------
///Globale
int n,k,raspuns,mod = 1000000007;
char s[16385];
long long heap;
unordered_map<long long,int>ap;
//-----------------------------------------------------
///Functii
void citire();
void rezolvare();
void afisare();
//-----------------------------------------------------
int main()
{
	citire();
	rezolvare();
	afisare();
	return 0;
}
//-----------------------------------------------------
void afisare()
{
	g << raspuns;
}
//-----------------------------------------------------
void rezolvare()
{
    if(k == 1)
    {
        raspuns = n;
        return;
    }
	int in = 1;
	int sf = n;
	while(in <= sf)
	{
	    int r = 0;
		int mij = (in + sf) / 2;
        heap = 0;
		int p = 1;
		for(int i = 1; i <= mij; ++i)
		{
			heap = (heap * 41 + (s[i] - '\0')) % mod;
			if(i != 1)
				p = p * 41 % mod;
		}
		ap[heap]++;
		int poz = n;
		for(int i = mij + 1; i <= n; ++i)
        {
            heap -= p * (s[i - mij] - '\0') % mod;
            if(heap < 0)
                heap += mod;
            heap = (heap * 41 + (s[i] - '\0')) % mod;
            ap[heap]++;
            if(ap[heap] == k)
            {
                r = 1;
                poz = i;
                break;
            }
        }
        heap = 0;
        for(int i = 1; i <= mij; ++i)
		{
			heap = (heap * 41 + (s[i] - '\0')) % mod;
			if(i != 1)
				p = p * 41 % mod;
		}
		ap[heap] = 0;
		for(int i = mij + 1; i <= poz; ++i)
        {
            heap -= p * (s[i - mij] - '\0') % mod;
            if(heap < 0)
                heap += mod;
            heap = (heap * 41 + (s[i] - '\0')) % mod;
            ap[heap] = 0;
        }
        if(r == 1)
        {
            raspuns = mij;
            in = mij + 1;
        }
        else
            sf = mij - 1;
	}
}
//-----------------------------------------------------
void citire()
{
	f >> n >> k >> s + 1;
}