HDU 4125 2011福州现场赛E题 KMP+笛卡尔树 (二)

2014-11-24 10:23:19 · 作者: · 浏览: 1
while(top>=0)
{
int num = st[top];
int a = pp[num].a;
int b = pp[num].b;
int id = pp[num].id;
char k = hash[id] % 2+'0';
//s1[len++] = k;


if(now[num]==0) //第一次
{
if(hash[id]>a) //有左孩子
{
pp[++cnt].a = a;
pp[cnt].b = hash[id]-1;
pp[cnt].id = query(a, hash[id]-1, 1, n, 1);
st[++top] = cnt;
s1[len++] = k;
}
now[num] = 1;
}
else if(now[num]==1) //第二次,处理完左孩子了
{
if(hash[id]
{
pp[++cnt].a = hash[id]+1;
pp[cnt].b = b;
pp[cnt].id = query(hash[id]+1, b, 1, n, 1);
st[++top] = cnt;
s1[len++] = k;
}
now[num] = 2;
}
else if(now[num]==2) //第三次,两个孩子都处理完了
{
s1[len++] = k;
--top;
}
}

s1[len] = '\0';
// cout< scanf("%s", s2);
get_next(s2);
printf("Case #%d: %d\n", ++tt, KMP(s1, s2));
}
return 0;
}