Pagini recente » Cod sursa (job #963234) | Cod sursa (job #2557590) | Cod sursa (job #2395160) | Cod sursa (job #2506050) | Cod sursa (job #2544094)
#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;
}