Cod sursa(job #1246245)

Utilizator MaarcellKurt Godel Maarcell Data 20 octombrie 2014 20:10:33
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;

int N,K, heap[26][500050],sz[26], dp[500010], pos[500010]; char a[500010][20];

int get_max(char c){
    return dp[heap[c-'a'][1]];
}

void heap_swap(int k,int x, int y){
    pos[heap[k][x]]=y;
    pos[heap[k][y]]=x;
    int aux=heap[k][x];
    heap[k][x]=heap[k][y];
    heap[k][y]=aux;
}

void add(char c, int x){
    int ind=c-'a',p;
    sz[ind]++;
    heap[ind][sz[ind]]=x;
    p=sz[ind];

    while(p/2 && dp[heap[ind][p/2]]<dp[heap[ind][p]]){
        heap_swap(ind,p,p/2);
        p=p/2;
    }
}


void del(char c, int x){
    int ind=c-'a',p;
    p=pos[x];
    heap[ind][p]=heap[ind][sz[ind]--];
    pos[heap[ind][p]]=p;

    while (p*2+1<=sz[ind] && (dp[heap[ind][p*2]]>dp[heap[ind][p]] || dp[heap[ind][p*2+1]]>dp[heap[ind][p]])){
        if (dp[heap[ind][p*2]]>dp[heap[ind][p*2+1]]){
            heap_swap(ind,p,p*2);
            p=p*2;
        }
        else{
            heap_swap(ind,p,p*2+1);
            p=p*2+1;
        }
    }

    if (p*2<=sz[ind] && dp[heap[ind][p*2]]>dp[heap[ind][p]])
        heap_swap(ind,p,p*2);

}

int main(){
    freopen("raci.in","r",stdin);
    freopen("raci.out","w",stdout);
    scanf("%d %d\n",&N,&K);

    int i,l;
    for (i=1; i<=N; i++)
        scanf("%s",a[i]);

    for (i=1; i<=K+1; i++){
        dp[i]=1+get_max(a[i][0]);
        l=strlen(a[i]);
        add(a[i][l-1],i);
    }

    for (i=K+2; i<=N; i++){
        l=strlen(a[i-K-1]);
        del(a[i-K-1][l-1],i-K-1);

        dp[i]=1+get_max(a[i][0]);
        l=strlen(a[i]);
        add(a[i][l-1],i);
    }

    int MAX=0;
    for (i=1; i<=N; i++)
        MAX=max(MAX,dp[i]);

    printf("%d",MAX);



    return 0;
}