Cod sursa(job #2548123)

Utilizator alex2209alexPavel Alexandru alex2209alex Data 16 februarie 2020 11:23:58
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
#define MOD 1000000007
#define baza 101
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
long long v[16385],k,n,putere[16385];
char ch;
const int modul = 100007;
vector<pair<int,int>>numere[100010];
void adauga(int val)
{
	int i,verificare = 0,poz;
	poz = val % modul;
	for(i = 0; i < numere[poz].size(); ++i)
		if(numere[poz][i].first == val)
		{
			numere[poz][i].second++;
			verificare = 1;
			break;
		}
	if(verificare == 0)
		numere[poz].push_back({val,1});
}
int numar_aparitii(int val)
{
	int i,poz;
	poz = val % modul;
	for(i = 0; i < numere[poz].size(); ++i)
		if(numere[poz][i].first == val)
			return numere[poz][i].second;
	return 0;
}
bool verificare(long long l)
{
	long long nr = 0,i;
	for(i = 1; i <= l; ++i)
		nr = (1LL * nr * baza + v[i]) % MOD;
	adauga(nr);
	if(numar_aparitii(nr) >= k)
		return 1;
	for(i = l + 1; i <= n; ++i)
	{
		nr = (nr - (putere[l - 1] * v[i - l]) % MOD + MOD) % MOD;
		nr = (1LL * nr * baza + v[i]) % MOD;
		adauga(nr);
		if(numar_aparitii(nr)>=k)
			return 1;
	}
	return 0;
}
long long i,in,sf,mij,rasp;
int main()
{
	f >> n >> k;
	putere[0] = 1;
	for(i = 1; i <= n; ++i)
	{
		f >> ch;
		v[i] = int(ch) - 48;
		putere[i] = (1LL * putere[i - 1] * baza) % MOD;
	}
	in = 1;
	sf = n;
	while(in <= sf)
	{
		mij = (in + sf) / 2;
		if(verificare(mij) == 1)
		{
			rasp = mij;
			in = mij + 1;
		}
		else
			sf = mij - 1;
		for(i = 0; i <= 100007; ++i)
			numere[i].clear();
	}
	g << rasp;
	return 0;
}