Cod sursa(job #1064944)

Utilizator blasterzMircea Dima blasterz Data 22 decembrie 2013 15:34:19
Problema Substr Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
#include <tr1/unordered_map>
using namespace std;

#define N 17000
#define M1 1000007
#define M2 2000003
char a[N];
int n, K;

struct nod {
    int h, cnt;
    nod *next;
    nod(){};
    nod(int _h, int _cnt) {
        h = _h;
        cnt = _cnt;
    };
};

nod *H1[M1];
nod *H2[M2];

inline nod *find(nod *H, int h) {
    for (nod *p = H; p; p = p->next)
        if (p->h == h)
            return p;
    return NULL;
}



int isOk(int len) {
    int i;
    int nr1 = 0, nr2 = 0;
    int h1 = 0, h2 = 0;
    int pw1 = 1, pw2 = 1;
    nod *it, *jt;
    for (i = 0; i < M1; ++i)
        H1[i] = 0;
    for (i = 0; i < M2; ++i)
        H2[i] = 0;

    for (i = 1; i < len; ++i)
        pw1 = (pw1 * 257) % M1,
        pw2 = (pw2 * 259) % M2;
    
    for (i = 1; i <= n; ++i) {
        h1 = (h1 * 257 + a[i]) % M1;
        h2 = (h2 * 259 + a[i]) % M2;
       
        if (i >= len) {
            it = find(H1[h1], h1);
            jt = find(H2[h2], h2);
            if (it == NULL) {
                nod *p = new nod;
                p->h = h1;
                p->cnt = 1;
                p->next = H1[h1];
                H1[h1] = p;
 
                nr1 = 1;
            }
            else {
               ++it->cnt;
                nr1 = it->cnt;
            }
            if (jt == NULL) {
                nod *p = new nod;
                p->h = h2;
                p->cnt = 1;
                p->next = H2[h2];
                H2[h2] = p;

                nr2 = 1;
            }
            else {
                ++jt->cnt;
                nr2 = jt->cnt;
            }
            int nr = min(nr1, nr2);//min(H1[h1], H2[h2]);
            if (nr >= K)
                return true;
            h1 = ((h1 - (pw1 * a[i - len + 1])) % M1 + M1) % M1;
            h2 = ((h2 - (pw2 * a[i - len + 1])) % M2 + M2) % M2;
        }
    }
    return false;
}

int main() {
    freopen ("substr.in", "r", stdin);
    freopen ("substr.out", "w", stdout);
    scanf ("%d %d\n", &n, &K);
    scanf ("%s", a + 1);

    int i, cnt;
    int nr = n;// 1 + (n / K);
    for (cnt = 1; cnt * 2 <= nr; cnt *= 2);
    for (i = 1; cnt; cnt >>= 1)
        if (i + cnt <= n && isOk(i + cnt))
            i += cnt;
    
    printf ("%d\n", i);
}