Cod sursa(job #2456120)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 13 septembrie 2019 18:49:27
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("substr.in");
ofstream fout("substr.out");

const int mod1 = 99929;
const int mod2 = 99923;

const int alpha = 26;
const int DIM = 17000;

int power1[DIM];
int power2[DIM];

int n, k;

string s;

bool check(int i)
{
	int h1 = 0;
	int h2 = 0;
	
	vector <pair <int, int> > v;
	
	for(int j = 1; j <= i; j++)
	{
		h1 = (h1 * alpha + (s[j] - 'a')) % mod1;
		h2 = (h2 * alpha + (s[j] - 'a')) % mod2;
	}
	
	v.push_back({h1, h2});
	
	for(int j = i + 1; j <= n; j++)
	{
		h1 = (h1 - (power1[i] * (s[j - i] - 'a')) % mod1 + mod1) % mod1;
		h2 = (h2 - (power2[i] * (s[j - i] - 'a')) % mod2 + mod2) % mod2;
		
		h1 = (h1 * alpha + (s[j] - 'a')) % mod1;
		h2 = (h2 * alpha + (s[j] - 'a')) % mod2;
		
		v.push_back({h1, h2});
	}
	
	sort(v.begin(), v.end());
	
	int nr = 1;
	
	for(int j = 1; j < v.size(); j++)
		if(v[j] == v[j - 1])
		{
			nr++;
			
			if(nr == k)
			{
				return true;
			}
		}
		else
		{
			nr = 1;
		}
	
	return false;
}

main()
{
	fin >> n >> k;
	
	if(k == 1)
	{
		fout << n;
		return 0;
	}
	
	power1[1] = 1;
	power2[1] = 1;
	
	for(int i = 2; i <= n; i++)
	{
		power1[i] = (power1[i - 1] * alpha) % mod1;
		power2[i] = (power2[i - 1] * alpha) % mod2;
	}
	
	fin >> s;
	
	s = ' ' + s;
	
	int l = 1;
	int r = n - k + 1;
	
	int res = 0;
	
	while(l <= r)
	{
		int mid = (l + r) / 2;
		
		if(check(mid) == true)
		{
			l = mid + 1;
			res = mid;
		}
		else
		{
			r = mid - 1;
		}
	}
	
	fout << res;
}