Cod sursa(job #2549315)

Utilizator NinjaCubeMihai Radovici NinjaCube Data 17 februarie 2020 16:29:31
Problema Substr Scor 0
Compilator cpp-64 Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.57 kb
#include<bits/stdc++.h>
#define MOD 666013
#define maxN 17005
#define MOD2 2011
using namespace std;
const int prim=73;
const int prim2=19;
vector<pair<int,int> > h;
char s[maxN];
int pw[maxN],n,st,dr,k,sol,pw2[maxN];
inline int Check(int mid)
{
    if(!mid) return 1;
    h.clear();
    int val=0;
    int val2=0;
    for(int i=1;i<=mid;i++)
    {
        val=(val*prim+s[i])%MOD;
        val2=(val2*prim2+s[i])%MOD2;
    }
    h.push_back({val,val2});
    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;

        val2=val2-(s[i-mid]*pw2[mid-1])%MOD2;
        while(val2<0) val2+=MOD2;
        val2=(val2*prim2+s[i])%MOD2;

        h.push_back({val,val2});
    }
      sort(h.begin(),h.end());
    int sz=h.size();
    int nr=1,sol=1;
    for(int i=0;i<sz;i++)
    {
        if(h[i].first==h[i+1].first && h[i+1].second==h[i].second)
        {
            nr++;
            sol=max(sol,nr);
        }
            else nr=1;
    }
    return sol;
}
int main()
{
    ifstream fin ("substr.in");
    ofstream fout("substr.out");
    cin>>n>>k;
    cin>>s+1;
    n=strlen(s+1);
    pw[0]=1;
    pw2[0]=1;
    for(int i=1;i<=n;i++)
    {
        pw[i]=(pw[i-1]*prim)%MOD;
        pw2[i]=(pw2[i-1]*prim2)%MOD2;
    }
    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;
    }
    cout<<sol;
    return 0;
}