#include<bits/stdc++.h>
using namespace std;
#define M 200005
int n,sum=1,a[M];
struct Node
{
int begin=-1,end=-1;
int pre=0,nex=0;
bool flag=false;//区间是否存在
};
Node F[M];
bool empty=true;
void del(const int &num)
{
F[num].begin=-1;F[num].end=-1;
F[num].flag=false;
F[F[num].nex].pre=F[num].pre;
F[F[num].pre].nex=F[num].nex;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
}
F[1].begin=1;F[1].end=1;F[1].flag=true;
for(int i=2;i<=n;++i)
{
if(a[i]==a[i-1]) F[sum].end++;
else
{
++sum;
F[sum].begin=i;F[sum].end=i;F[sum].flag=true;
F[i].pre=sum-1;F[i].nex=sum+1;
}
}
/*
for(int i=1;i<=sum;++i) printf("%d %d\n",F[i].begin,F[i].end);
return 0;
*/
while(1)
{
empty=true;
for(int i=1;i<=sum;++i)
{
if(F[i].flag)
{
printf("%d ",F[i].begin);
F[i].begin++;
}
}
for(int i=1;i<=sum;++i)
{
if(F[i].begin>F[i].end)
{
del(i);
++empty;
}
}
for(int i=1;i<=sum;++i)
{
if(F[i].flag&&F[F[i].pre].flag&&a[F[i].begin]==a[F[F[i].pre].end])
{
F[i].begin=F[F[i].pre].begin;
del(i);
}
}
for(int i=1;i<=sum;++i)
{
if(F[i].flag) empty=false;
}
if(empty) break;
printf("\n");
}
return 0;
}
看起来 似乎 没有问题