Cod sursa(job #3222435)

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

using namespace std;

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

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

unordered_map<long long, int> myMap;

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

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

    if(k == 1)
    {
        out << n;
        return 0;
    }

    //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;
}