Pagini recente » Cod sursa (job #2188149) | Istoria paginii runda/avram_iancu_10/clasament | Cod sursa (job #1979590) | Cod sursa (job #1917089) | Cod sursa (job #2548123)
#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;
}