Cod sursa(job #1988083)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 2 iunie 2017 01:14:39
Problema Substr Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<bits/stdc++.h>
#define MOD 666013
#define maxN 17005
using namespace std;
const long long prim=73LL;
int f[MOD+5];
char s[maxN];
long long pw[maxN];
int n,st,dr,k,sol;
inline int Check(int mid)
{
    if(!mid) return 1;
    memset(f,0,sizeof(f));
    //M.clear();
    long long val=0;
    for(int i=1;i<=mid;i++)
    {
        val=(val*(1LL*prim)+1LL*s[i])%MOD;
    }
   // M[val]=1;
    f[val]=1;
    int sol=1;
    for(int i=mid+1;i<=n;i++)
    {
        val=val-((1LL*s[i-mid])*pw[mid-1])%MOD;
        while(val<0) val+=MOD;
        val=(val*(1LL*prim)+1LL*s[i])%MOD;
     //   it=M.find(val);
      //  if(it!=M.end())
       // {
        //    it->second++;
         //   sol=max(sol,it->second);
        //}
         //   else
       // {
        //    M[val]=1;
        //}
        f[val]++;
        sol=max(sol,f[val]);
    }
    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]=1LL;
    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;
}