Pagini recente » Cod sursa (job #1207300) | Cod sursa (job #1485295) | Cod sursa (job #2357666) | Cod sursa (job #1898359) | Cod sursa (job #2547040)
#include <bits/stdc++.h>
#define MOD 1000000007
#define baza 101
#define MOD2 100000009
#define baza2 103
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 add (int val)
{
int i,ok=0,poz;
poz=val%modul;
for (i=0;i<numere[poz].size();i++)
{
if (numere[poz][i].first==val)
{
numere[poz][i].second++;
ok=1;
break;
}
}
if (ok==0)
{
numere[poz].push_back({val,1});
}
}
int cat (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 ok (long long lung)
{
long long nr=0,i;
for (i=1;i<=lung;i++)
{
nr=(1LL*nr*baza+v[i])%MOD;
}
add(nr);
if (cat(nr)>=k)
{
return 1;
}
for (i=lung+1;i<=n;i++)
{
nr=(nr-(putere[lung-1]*v[i-lung])%MOD+MOD)%MOD;
nr=(1LL*nr*baza+v[i])%MOD;
add(nr);
if (cat(nr)>=k)
{
return 1;
}
}
return 0;
}
long long i,st,dr,mij,sol;
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;
}
st=1;
dr=n;
while (st<=dr)
{
mij=(st+dr)/2;
if (ok(mij)==1)
{
sol=mij;
st=mij+1;
}
else
{
dr=mij-1;
}
for (i=0;i<=100007;i++)
{
numere[i].clear();
}
}
g<<sol;
return 0;
}