Cod sursa(job #1791044)
Utilizator | Data | 28 octombrie 2016 23:43:26 | |
---|---|---|---|
Problema | Substr | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.72 kb |
#include <cstdio>
#include <vector>
using namespace std;
vector <int> v[666017],v1[666017];
int n,k,i,st,dr,m,nr,x,x1,p1,p2,b[16388],z,j;
bool a[16388];
bool ok;
int main()
{
freopen ("substr.in","r",stdin);
freopen ("substr.out","w",stdout);
scanf ("%d %d\n", &n, &k);
for (i=1;i<=n;i++)
scanf ("%c", &a[i]);
if (k==1)
printf ("%d", n);
else
{
st=1;
dr=n;
while (st<=dr)
{
ok=false;
m=(st+dr)/2;
nr=0;
x=0;
x1=0;
p1=1;
p2=1;
for (i=1;i<=n;i++)
{
if (i<=m)
{
x=x*79+a[i]-'0';
x%=666013;
x1=x1*79+a[i]-'0';
x1%=100013;
if (i>1)
{
p1=p1*79%666013;
p2=p2*79%100013;
}
if (i==m)
{
z=v[x].size();
for (j=0;j<z;j++)
{
if (v[x][j]==x1)
{
v1[x][j]++;
if (v1[x][j]>=k)
ok=true;
break;
}
}
if (j==z)
{
v[x].push_back(x1);
v1[x].push_back(1);
}
b[++nr]=x;
}
}
else
{
x=x-p1*(a[i-m]-'0');
x%=666013;
if (x<0)
x+=666013;
x=x*79%666013;
x=(x+a[i]-'0')%666013;
x1=x1-p2*(a[i-m]-'0');
x1%=100013;
if (x1<0)
x1+=100013;
x1=x1*79%100013;
x1=(x1+a[i]-'0')%100013;
z=v[x].size();
for (j=0;j<z;j++)
{
if (v[x][j]==x1)
{
v1[x][j]++;
if (v1[x][j]>=k)
ok=true;
break;
}
}
if (j==z)
{
v[x].push_back(x1);
v1[x].push_back(1);
}
b[++nr]=x;
}
}
for (i=1;i<=nr;i++)
{
v[b[i]].clear();
v1[b[i]].clear();
}
if (ok==true)
st=m+1;
else
dr=m-1;
}
printf ("%d", dr);
}
return 0;
}