http://acm.hust.edu.cn/vjudge/contest/128024#problem/H
一个字符串有大小写对应,每次删掉相邻的大小写字母并记录相应位置,看最后能否删完。
#include <iostream>
#include <stack>
#include <cstdio>
using namespace std;
const int maxn=5050;
struct node
{
char c;
int id;
};
stack <node> a;
int main()
{
int n;
char s[maxn<<1];
int ans[maxn];
node tmp,tmp2;
while(~scanf("%d",&n))
{
int low_id=0,upper_id=0;
scanf("%s",s);
while(a.size())
a.pop();
for(int i=0; i<2*n; i++)
{
node tmp;
tmp.c=s[i];
if(s[i]>='a'&&s[i]<='z')
tmp.id=low_id++;
else if(s[i]>='A'&&s[i]<='Z')
tmp.id=upper_id++;
if(a.size())
{
node tmp2=a.top();
if(tmp2.c==tmp.c+32)//tmp.c daxie
{
ans[tmp.id]=tmp2.id;
a.pop();
}
else if(tmp2.c+32==tmp.c)
{
ans[tmp2.id]=tmp.id;
a.pop();
}
else
a.push(tmp);
}
else
a.push(tmp);
}
if(a.size())
printf("Impossible\n");
else
{
for(int i=0; i<n; i++)
{
if(i)
printf(" %d",ans[i]+1);
else
printf("%d",ans[i]+1);
}
printf("\n");
}
}
return 0;
}