每次取相邻的两个可以射击的从序列中删除,重复n次。
可以看作括号序列的匹配。
#include<cstdio> #include<vector> using namespace std; struct data { char c; int p; data(){} data(const char &cc,const int &pp) { c=cc; p=pp; } }; vector<data>a; typedef vector<data>::iterator ITER; int n,shoot[5010]; char s[10010]; int main() { //freopen("h.in","r",stdin); int p1=0,p2=0; scanf("%d%s",&n,s); for(int i=0;i<n*2;++i) { if(s[i]>='A' && s[i]<='Z') { ++p1; a.push_back(data(s[i],p1)); } else { ++p2; a.push_back(data(s[i],p2)); } } for(int i=0;i<n;++i) { bool flag=0; ITER k=a.begin(); ++k; for(ITER j=a.begin();k!=a.end();++j,++k) if((*j).c==(*k).c-32) { shoot[(*j).p]=(*k).p; ++k; a.erase(j,k); flag=1; break; } else if((*j).c-32==(*k).c) { shoot[(*k).p]=(*j).p; ++k; a.erase(j,k); flag=1; break; } if(!flag) { puts("Impossible"); return 0; } } for(int i=1;i<n;++i) printf("%d ",shoot[i]); printf("%d ",shoot[n]); return 0; }