Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 – Elimination Round 3), problem: (D) Santa Claus and a Palindrome Solution in C/C++
#include<stdio.h>
#include<stdlib.h>
typedef unsigned u;
int cmp(const void*x,const void*y){return*(int*)x-*(int*)y;}
typedef struct S{int*val;u id,vali,vala;struct S*nx[26];}v;
v*alloc()
{
v*x;u i;
x=(v*)malloc(sizeof(v));
for(i=-1;++i<26;)x->nx[i]=NULL;
x->val=(int*)calloc(x->vala=1,sizeof(int));
x->vali=x->id=0;
return x;
}
char S[222222],c;v *p,*q;u alo,pai;
void F(v*x)
{
u i,j;
if(x->id)
{
j=x->id;
for(q=p;(c=S[–j]);)
{
if(q==NULL)break;
c-=’a’;
q=q->nx[(u)c];
}
if(q!=NULL)
{
qsort(q->val,q->vali,sizeof(int),cmp);
if(q==x)
{
for(j=q->vali;j>1;j-=2)
{
if(q->val[j-1]+q->val[j-2]>0)
{
pai+=(q->val[j-1]+q->val[j-2])*2;
}
else break;
}
if(j<q->vali&&q->val[j]*-2>(int)alo)
alo=q->val[j]*-2;
if(j&&q->val[j-1]*2>(int)alo)
alo=q->val[j-1]*2;
}
else
{
qsort(x->val,x->vali,sizeof(int),cmp);
i=x->vali;j=q->vali;
while(i&&j)
{
if(x->val[–i]+q->val[–j]>0)
pai+=x->val[i]+q->val[j];
}
}
}
}
for(i=-1;++i<26;)if(x->nx[i]!=NULL)F(x->nx[i]);
return;
}
int main()
{
u n,l,i,j,k=1;int val;
scanf(“%u%u”,&n,&l);
p=alloc();
for(i=-1;++i<n;)
{
scanf(“%s”,S+k);
for(j=k-1,q=p;(c=S[++j]);)
{
c-=’a’;
if(q->nx[(u)c]==NULL)q->nx[(u)c]=alloc();
q=q->nx[(u)c];
}
scanf(“%d”,&val);
if(q->vali==q->vala)
q->val=(int*)realloc(q->val,(q->vala<<=1)*sizeof(int));
q->val[q->vali++]=val;
q->id=j;k=j+1;
}
F(p);
printf(“%u\n”,(pai+alo)>>1);
return 0;
}