Cod sursa(job #481613)

Utilizator andra23Laura Draghici andra23 Data 31 august 2010 23:07:24
Problema Substr Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<vector>
#define maxn 16400
#define r 2299963
#define b 79
#define rh 1299989

using namespace std;

struct elem {
    int inf, ap;
    elem(int a, int bb){
        inf = a;
        ap = bb;
    }
};

vector<elem> h[rh+5];
ofstream g("substr.out");
char a[maxn];
int prec[maxn];
int rest[rh+5];
int n, k;

int trym(int l){
    int val = 0, nr = 0, cod, i, j, poz, nrt = 0;
    for (i = 0; i<l; i++){
        val = (val*b+a[i]-48)%r;
    }
    poz = val%rh;
    h[poz].push_back(elem(val, 1));
    int l1 = strlen(a);
    for (i = l; i < l1-1; i++){
        val = val - (prec[l-1]*(a[i-l]-48))%r;
        if (val < 0)
            val = val+r;
        val = (val*b+a[i]-48)%r;
        poz = val%rh;
        cod = 1;
        for (j=0; j<h[poz].size(); j++)
            if (h[poz][j].inf == val){
                h[poz][j].ap++;
                if (h[poz][j].ap > nr)
                    nr = h[poz][j].ap;
                cod = 0;
                break;
            }
        if (cod == 1){
            h[poz].push_back(elem(val, 1)); 
            nrt++;
            rest[nrt] = poz;
        }   
    }
    for (i = 1; i <= nrt; i++)
        vector<elem>().swap(h[rest[i]]);
    
    if (nr >= k)
        return 1;
    return 0;  
}

int bsearch(int p, int u){
    int m, poz=0;
    while (p <= u){
        m = (p+u)/2;
        if (trym(m) == 1){
            poz = m;
            p = m+1;
        }
        else 
            u = m-1;    
    } 
    return poz;   
}

int main(){
    freopen("substr.in", "r", stdin);
    
    int i, j, val, poz, cod, l;
    scanf("%d %d ", &n, &k);
    fgets(a, maxn, stdin);
    
    prec[0] = 1;
    for (i = 1; i <= n/k; i++)
        prec[i]=(prec[i-1]*b)%r; 
    int rez = bsearch(0, n/k);
    
    g<<rez<<endl;
    
    return 0;
}