这题写了几天。收获不少。
用堆实现的优先队列的层次结构。
堆还是第一次应用。即能以LOG2N,进行插入删除操作。又不会象二叉搜索树那样会退化。比用平衡树方便的多。还有二分查找的效率!真是 好东西呀!
FOR循环上写了个STRLEN,百万次循环,时间耗费不少。这错误也托了我好几小时!遇到大数据还是要慎重啊!
还有就是那2个函数S=1时的特例处理。
最后2秒过的。呵呵。
附代码。看有写人不到1秒就过了。不知道还能如何优化?
#include
<
stdio.h
>
#include
<
iostream
>
#include
<
string
.h
>
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
orders
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int begin;
int num;
orders *next;
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
heapball
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int num;
char colo;
struct chainball *tochain;
orders *beginorder,*endorder;
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
chainball
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int num;
char colo;
int toheap;
struct chainball *next,*fro;
orders *beginorder,*endorder;
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
heapball heap[
1000001
];
int
heapnum;
char
ch[
1000000
];
struct
chainball
*
head;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
inline
int
heapdown(
int
s)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{ int j;
heapball temp;
temp=heap[s];
for (j=s*2;j<=heapnum;j*=2)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if ((j<heapnum)&&((heap[j+1].num>heap[j].num)||((heap[j+1].num==heap[j].num)&&(heap[j+1].beginorder->begin<heap[j].beginorder->begin))))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
j++;
}
if ((temp.num>heap[j].num)||((temp.num==heap[j].num)&&(temp.beginorder->begin<heap[j].beginorder->begin)))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
break;
}
heap[s]=heap[j];
heap[j].tochain->toheap=s;
s=j;
}
heap[s]=temp;
temp.tochain->toheap=s;
return s;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
inline
int
heapup(
int
s)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
heapball temp;int j;
temp=heap[s];
j=s/2;
while (j!=0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if ((heap[j].num<temp.num)||((heap[j].num==temp.num)&&(heap[j].beginorder->begin>temp.beginorder->begin)))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
heap[s]=heap[j];
heap[j].tochain->toheap=s;
s=j;
j=j/2;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
break;
}
}
heap[s]=temp;
temp.tochain->toheap=s;
return s;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
inline
int
insert(heapball newball)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
heapnum++;
heap[heapnum]=newball;
if (heapnum==1)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return 1;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return(heapup(heapnum));
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
inline
void
erase(
int
s)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{int f;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
heap[s]=heap[heapnum];
heapnum--;
if (s!=1)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
f=s/2;
if ((heap[f].num<heap[s].num)||((heap[f].num==heap[s].num)&&(heap[f].beginorder->begin>heap[s].beginorder->begin)))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
heapup(s);
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
heapdown(s);
}
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
heapdown(s);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
inline
void
output_max()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{int i;chainball *p,*pf,*pn,*tempchain;heapball tempheap;
printf("%c",heap[1].colo);
while (heap[1].beginorder!=NULL)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
for (i=0;i<heap[1].beginorder->num;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
printf(" %d",heap[1].beginorder->begin+i);
}
heap[1].beginorder=heap[1].beginorder->next;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
p=heap[1].tochain;
heap[1]=heap[heapnum];
heapnum--;
heapdown(1);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if ((p->fro!=NULL)&&(p->next!=NULL))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
pf=p->fro;
pn=p->next;
if (pf->colo==pn->colo)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
tempchain=new chainball;
if (pf->fro!=NULL) pf->fro->next=tempchain;
if (pn->next!=NULL) pn->next->fro=tempchain;
tempchain->colo=pf->colo;
tempchain->num=pf->num+pn->num;
tempchain->fro=pf->fro;
tempchain->next=pn->next;
tempchain->beginorder=pf->beginorder;
pf->endorder->next=pn->beginorder;
tempchain->endorder=pn->endorder;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
tempheap.colo=pf->colo;
tempheap.num=tempchain->num;
tempheap.beginorder=tempchain->beginorder;
tempheap.endorder=tempchain->endorder;
tempheap.tochain=tempchain;
erase(pf->toheap);
free(pf);
erase(pn->toheap);
free(pn);
tempchain->toheap=insert(tempheap);
}
pf->next=pn;
pn->fro=pf;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (p->fro==NULL)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (p->next!=NULL) p->next->fro=NULL;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
p->fro->next=NULL;
}
}
free(p);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
construct()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
int i,l;
orders *orp;
chainball * p,*pf;
scanf("%s",ch);
p=new chainball;
orp=new orders;
p->colo=ch[0];
p->num=1;
orp->num=1;
orp->begin=1;
p->beginorder=orp;
p->endorder=orp;
p->toheap=1;
pf=p;
head=p;
head->fro=NULL;
heapnum=1;
heap[1].colo=ch[0];
heap[1].num=1;
heap[1].tochain=p;
heap[1].beginorder=orp;
heap[1].endorder=orp;
heap[1].beginorder->next=NULL;
l=strlen(ch);
for (i=1;i<l;i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (ch[i]==pf->colo)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
pf->num++;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
p=new chainball;
heapnum++;
orp=new orders;
p->colo=ch[i];
heap[heapnum].colo=ch[i];
p->num=1;
heap[heapnum].beginorder=orp;
p->beginorder=orp;
heap[heapnum].endorder=orp;
p->endorder=orp;
heap[heapnum].num=1;
p->num=1;
heap[heapnum].beginorder->begin=i+1;
p->beginorder->begin=i+1;
heap[heapnum].beginorder->next=NULL;
p->beginorder->next=NULL;
heap[heapnum-1].num=pf->num;
heap[heapnum-1].beginorder->num=pf->num;
pf->beginorder->num=pf->num;
pf->next=p;
p->fro=pf;
heap[heapnum].tochain=p;
p->toheap=heapnum;
pf=p;
}
}
pf->next=NULL;
heap[heapnum].num=pf->num;
heap[heapnum].beginorder->num=pf->num;
pf->beginorder->num=pf->num;
heap[heapnum].beginorder->next=NULL;
pf->beginorder->next=NULL;
for (i=heapnum/2;i>=1;i--)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
heapdown(i);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
construct();
while ((!(heap[1].num==1))&&(heapnum>0))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
output_max();
if ((!(heap[1].num==1))&&(heapnum>0)) printf(" ");
else printf(" ");
}
}