Cod sursa(job #1791044)

Utilizator savulescustefanSavulescu Stefan savulescustefan 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;
}