Cod sursa(job #3259609)

Utilizator Alexbora13Bora Ioan Alexandru Alexbora13 Data 26 noiembrie 2024 21:27:16
Problema Substr Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

ifstream fin("substr.in");
ofstream fout("substr.out");

const int b = 31;
const int mod = 200000000017;

unordered_map <int, int> freq;
string A;
int n, k;

int ok(int ind)
{
    int hash = 0;
    int p    = 1;
    for(int i=1; i<=ind; i++)
    {
       if(i != 1)p = (1ll*p*b)%mod;
       hash = (1ll*hash*b + (A[i]-'0'))%mod;
    }
    freq.clear();
    for(int i=ind+1; i<=n; i++)
    {
        hash = (hash - (A[i - ind] - '0') * p) % mod;
        if(hash < 0)hash+=mod;
        hash = (1ll*hash*b + (A[i]-'0'))%mod;
        freq[hash]++;
        if(freq[hash] >= k)return 1;
    }
    return 0;
}

signed main()
{
    fin >>  n >> k;
    fin >> A;
    A = 'a'+A;
    int st = 1, dr = n;//verific daca prefixul care se termina in mij apare de k ori
    int sol = -1;
    while(st <= dr)
    {
        int mij = (st+dr)/2;
        if(ok(mij))
            st = mij+1, sol = mij;
        else
            dr = mij-1;
    }
    fout << sol;
    return 0;
}