题意:
给定灵魂猎手,射杀灵魂, 只能射直线,而且要求弹道不能重叠。问题是: 灵魂猎手射杀的是第几个幽灵
灵魂猎手是大写字母,幽灵是小写字母。
思路:
压栈,如果可以匹配就弹出。
比赛看错题了。看成第几个开枪了。就很ZZ
#include <iostream>
#include <cstdio>
#include <queue>
#include <map>
#include <cmath>
#include <algorithm>
#include <stack>
using namespace std;
int ans[50005];
char s[50005];
int num[50005];
int main()
{
stack<int>q;
int n;
cin>>n;
cin>>s;
int cnt=0;
for(int i=0; s[i];i++)
{
if(s[i]>='a'&&s[i]<='z')
num[i]=++cnt;
if(q.empty())
{
q.push(i);
}
else
{
int pos=q.top();
if( s[pos]<='z' && s[pos]>='a' )
{
if(s[i]<='Z'&&s[i]>='A')
{
if(s[i]+32!=s[pos])
{
q.push(i);
}
else
{
ans[i]=num[pos];
q.pop();
}
}
else
q.push(i);
}
else
{
if(s[i]<='z'&&s[i]>='a')
{
if(s[i]-32!=s[pos])
{
q.push(i);
}
else
{
ans[pos]=num[i];
q.pop();
}
}
else
q.push(i);
}
}
}
if(!q.empty())
{
printf("Impossible\n");
}
else
{
int yes=0;
for(int i=0;i<n*2;i++)
if(ans[i]!=0)
{
if(yes)
printf(" ");
yes=1;
printf("%d",ans[i]);
}
}
return 0;
}