Cod sursa(job #3222424)

Utilizator Robilika2007Robert Badea Robilika2007 Data 10 aprilie 2024 01:09:29
Problema Substr Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <unordered_map>

using namespace std;

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

#define MAX_N 16384
#define MAX_C 27
#define MOD 1000000009
char v[MAX_N];
int n;

unordered_map<int, int> myMap;

int lgPut(int a, int b)
{
    if(b == 1)
        return a;
    if(b % 2 == 0)
    {
        return lgPut((long long) a * a % MOD, b / 2);
    } else
    {
        return (long long) a * lgPut((long long) a * a % MOD, b / 2) % MOD;
    }
}

int verif(int k)
{
    myMap.clear();
    long long curr = 0;
    for(int i = 0; i < k; ++i) //building the first number
    {
        curr = (long long) (curr * MAX_C + (v[i] - 'a')) % MOD;
    }
    //cout << curr <<  " ";
    myMap[curr]++;
    for(int i = k; i < n; ++i)
    {
        curr -= (long long) ((v[i - k] - 'a') * lgPut(MAX_C, k - 1)) % MOD;
        curr = (long long) (curr * MAX_C + (v[i] - 'a')) % MOD;

       // cout << curr << " ";

        myMap[curr]++;
    }
    int ans = 0;
    for(auto x : myMap)
    {
        //cout << x.first << " " << x.second << '\n';
        ans = max(ans, x.second);
    }
   // cout << '\n';
    return ans;
}

int main()
{
    int k;
    in >> n >> k;
    for(int i = 0; i < n; ++i)
    {
        in >> v[i];
    }

    //cautare binara
    int st = 0, dr = MAX_N, mid;
    while(dr - st > 1)
    {
        mid = (st + dr) / 2;
        cout << st << " " << mid << " " << dr << '\n';
        if(verif(mid) >= k)
        {
            st = mid;
        } else
        {
            dr = mid;
        }
    }
    out << st;
    return 0;
}