Cod sursa(job #1988080)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 2 iunie 2017 01:08:15
Problema Substr Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<bits/stdc++.h>
#define MOD 666013
#define maxN 17005
using namespace std;
const int prim=73;
map<int,int> M;
map<int,int>::iterator it;
char s[maxN];
int pw[maxN],n,st,dr,k,sol;
inline int Check(int mid)
{
    M.clear();
    int val=0;
    for(int i=1;i<=mid;i++)
    {
        val=(val*prim+s[i])%MOD;
    }
    M[val]=1;
    int sol=1;
    for(int i=mid+1;i<=n;i++)
    {
        val=val-(s[i-mid]*pw[mid-1])%MOD;
        while(val<0) val+=MOD;
        val=(val*prim+s[i])%MOD;
        it=M.find(val);
        if(it!=M.end())
        {
            it->second++;
            sol=max(sol,it->second);
        }
            else
        {
            M[val]=1;
        }
    }
    return sol;
}
int main()
{
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);
    scanf("%d%d",&n,&k);
    scanf("%s",s+1);
    n=strlen(s+1);
    pw[0]=1;
    for(int i=1;i<=n;i++)
    {
        pw[i]=(pw[i-1]*prim)%MOD;
    }
    st=0;
    dr=n;
    while(st<=dr)
    {
        int mid=(st+dr)>>1;
        if(Check(mid)>=k)
        {
            sol=mid;
            st=mid+1;
        }
            else dr=mid-1;
    }
    printf("%d\n",sol);
    return 0;
}