Cod sursa(job #1804820)

Utilizator ade_tomiEnache Adelina ade_tomi Data 13 noiembrie 2016 01:17:46
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 16500;
const int MOD1 = 100019;
const int MOD2 = 100043;
vector <pair<int,int> > v;
int  s[NMAX];
int n, k;
int ok(int p)
{
    v.clear();
    int h1 = 0, h2 = 0, put1 = 1, put2 = 1;
    for (int i = 0; i < p ; i++)
    {
        h1 = (h1 * 63 + s[i]) % MOD1;
        h2 = (h2 * 63 + s[i]) % MOD2;
        if (i != p - 1){
            put1 = (put1 * 63) % MOD1;
            put2 = (put2 * 63) % MOD2;
        }
    }
    v.push_back({h1, h2});
    for (int i = p; i < n; i++)
    {
        h1 = ((h1 - (s[i - p] * put1) % MOD1 + MOD1) * 63 + s[i]) % MOD1;
        h2 = ((h2 - (s[i - p] * put2) % MOD2 + MOD2) * 63 + s[i]) % MOD2;
       
        v.push_back({h1, h2});

    }
    
   cout << "p = " << p << "\n";
    for (int i = 0; i < v.size(); i++)
        cout << v[i].first << " " ;
    sort(v.begin(),v.end());
    int ap = 1;
    for (int i = 1; i < v.size(); i++)
        if(v[i].first == v[i - 1].first && v[i].second == v[i-1].second)
        {
            ap++;
            if (ap >= k)
                return 1;
        }
        else
            ap = 1;
    if (k == 1)
        return 1;
    return 0;
}
int main ()
{
    ifstream cin ("substr.in");
    ofstream cout ("substr.out");
    cin >> n >> k;
   
    for (int i = 0 ; i < n; i++)
    {
        char c;
        cin >> c;
       
        s[i] = c;
        if (c >= '0' && c <= '9')
            s[i] = s[i] -  '0' + 1;
        else if (c >= 'a' && c <= 'z') 
            s[i] =s[i] - 'a' + 11;
           
       
        else if (c >= 'A' && c <= 'Z')
            s[i] = s[i] -  'A' + 37;

    }
    
    int l1 = 1, sol = 0;
    int l2 = n;
    while (l1 <= l2)
    {
        int mid = (l1 + l2) / 2;
        if (ok(mid))
        {
            sol = mid;
            l1 = mid + 1;
        }
        else l2 = mid  - 1;
    }
    cout << sol ;
    return 0;
    
}