Cod sursa(job #1074157)

Utilizator krissu93FMI Tiugan Cristiana Elena krissu93 Data 7 ianuarie 2014 11:55:45
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 0.98 kb
#include <fstream>
#include <unordered_map>

using namespace std;

const int BASE = 73;
const int NMAX = 16390;
int sol, n, k;
char s[NMAX];

void get_data(){
  ifstream in("substr.in");
  in>>n>>k;
  in>>s;
  in.close();
}

bool ok(int dim){
  unordered_map< unsigned int, int> hash;
  unsigned int key = 0, power = 1;
  for (int i = 0; i < dim; ++i){
    key = key * BASE + s[i];
    if (i) power *= BASE;
  }

  hash[key] = 1;

  for (int i = dim; i < n; ++i){
    key = (key - power * s[i - dim]) * BASE + s[i];
    if (hash.find(key) != hash.end() ) hash[key]++;
    else hash[key] = 1;
    if (hash[key] >= k ) return 1;
  }

  return 0;
}


int solve(){
  int left = 0, right = n, middle;
  if (k==1) return n;
  while( left <= right ){
    middle = (left+right) / 2;
    if ( ok(middle) ) {
      sol = middle;
      left = middle + 1;
    }else
      right = middle - 1;
  }
  return sol;
}

int main(){
  get_data();
  ofstream out("substr.out");
  out<<solve();
  out.close();
  return 0;
}