Cod sursa(job #2467427)

Utilizator DysKodeTurturica Razvan DysKode Data 4 octombrie 2019 13:16:37
Problema Substr Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("substr.in");
ofstream fout("substr.out");
int D[20][16400];

int main()
{
    int n, k;
    fin >> n >> k;
    string s;
    fin >> s;
    for(int i = 1 ; i <= n ; i++)
    {
        D[0][i] = s[i-1];
    }
    int linie = 0;
    int off = 0;
    vector<pair< pair<int,int> , int> > v(n+1,{{0,0},0});
    for(int i = 1 ; i*2 <= n ; i*=2)
    {
        linie++;
        off = i;
        for(int j = 1 ; j <= n ; j++)
        {
            if(j+i > n)
                v[j] = { {D[linie-1][j], -1}, j};
            else
                v[j] = { {D[linie-1][j], D[linie-1][j+i]}, j };
        }
        sort(v.begin(), v.end());
        int curent;
        int ok = 0;
        for(int j = 1 ; j <= n ; j++)
        {
            curent = 1;
            D[linie][ v[j].second ] = j;
            while( j+1<= n && v[j].first == v[j+1].first )
            {
                curent++;
                D[linie][v[j+1].second] = D[linie][v[j].second];
                j++;
            }
            if(curent >= k)
            {
                ok = 1;
            }
        }
    }
    int baza= 0;
    vector< int > ans(n+1, 0);
    v[0] = {{-2,-2},0};
    for(; linie>=0 ; linie-- )
    {
        for(int i = 1 ; i <= n ; i++)
        {
            if( i + (1<<linie) + baza - 1 <= n )
                v[i] = { {ans[i], D[linie][i+baza]}, i };
            else
                v[i] = { {ans[i], -1}, i };
        }
        sort(v.begin(), v.end());
        int ok = 0;
        for(int i = 1 ; i <= n ; i++ )
        {
            int current = 1;
            while(i+1<= n && v[i].first == v[i+1].first )
                i++, current++;
            if(current >= k && (v[i].first.first != 0 || v[i].first.second != -1) )
                ok = 1;
        }
        if(ok)
        {
            baza += (1<<linie);
            for(int i = 1 ; i <= n ; i++)
            {
                ans[ v[i].second ] = i;
                while(v[i].first == v[i+1].first && i+1 <= n)
                {
                    ans[v[i+1].second] = ans[v[i].second];
                    i++;
                }
            }
        }
    }
    fout << baza;
}