Pagini recente » Cod sursa (job #1636853) | Cod sursa (job #994842) | Cod sursa (job #2436623) | Cod sursa (job #2452646) | Cod sursa (job #1246245)
#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;
}