/* 题意:给出两个字符串A,B,栈的压入弹出操作使A变成B,i表示输入,o表示输出。 请求出所有可能的操作,按字典序输出。 分析:已知边界条件是压入次数==A.size()&&弹出次数==B.size()。用递归回溯求出所有可能的操作顺序 */ #include<iostream> #include<vector> #include<string> #include<stack> #include<algorithm> #include<cstring> using namespace std; string s1,s2; stack <char> st;//存压入弹出的字母 vector <char> io;//存操作顺序 int l; bool able(string a,string b) { int num1[100],num2[100]; memset(num1,0,sizeof(num1)); memset(num2,0,sizeof(num2)); if(a.size()!=b.size())return 0; for(int i=0;i<a.size();i++) num1[a[i]-'a']++; for(int i=0;i<b.size();i++) num2[b[i]-'a']++; for(int i=0;i<26;i++) if(num1[i]!=num2[i])return 0; return 1; } void DFS(int i,int o)//i表示压入的次数,o表示弹出次数 { if(i==l&&o==l) { for(int k=0;k<io.size();k++) cout<<io[k]<<" "; cout<<endl; } if(i<l)//这步在前保证了字典序输出 { st.push(s1[i]); io.push_back('i'); DFS(i+1,o); io.pop_back(); st.pop(); } if(o<l&&o<i&&st.top()==s2[o])//可以弹出满足条件 { st.pop(); io.push_back('o'); DFS(i,o+1); io.pop_back(); st.push(s2[o]); } } int main() { while(cin>>s1>>s2) { if(!able(s1,s2)){cout<<"["<<endl;cout<<"]"<<endl;continue;} io.clear(); l=s1.size(); cout<<"["<<endl; DFS(0,0); cout<<"]"<<endl; } }