#include <iostream> #include <string> #include <stack> #include <vector> #include <algorithm> #include <cstdio> using namespace std; /* by ashione 2011-6-13 st 用来模拟栈的操作,进栈或者出栈 ve 是一个向量,就是一个存储的数组 首先讲s,t串分别排序(也可以判断各个字母的个数是否相等),如果不相等,那么表明是不可能通过操作转换成t串的。 接下来就是进行一轮DFS,那可以明确的知道,我们有两种操作类型可以采取,进栈和出栈,同时要回溯处理才能满足从深一层的状态回到上一层不会破坏原始数据。 但是,也不可能随意进栈出栈。能够进行操作的分别是: 1.当进栈数小于总长度是(leni<len),可以进栈。 2.当且仅当出栈数小于进栈数(leno<leni),并且出栈数小于总长度(leno<len),当然还要满足要出栈的字符恰好等于第leno个字符(t[leno]),方可出栈。 以上就是进栈和出栈的两种状态。 需要满足的条件有三个: 1.当 出栈个数大于进栈个数,进栈的个数 大于 长度时 表明已经错误,不能进行操作。 2.当 进栈个数<总长度,可以尽可能进栈。 3.当 进栈数 = 出栈数 = 总长度 时 ,表示已经匹配成功,可以进行输出。(因为有回溯每一个状态是不会相互干扰的,所以没有必要清空)。 */ stack< char > st; vector <char > ve; string s,t; void output(){ for(int i=0;i<ve.size();i++) cout<<ve[i]<<" "; cout<<endl; } void dfs(int leno,int leni,int len){ if(leno==len && leno==leni) output(); if(leni<len){ st.push(s[leni]); ve.push_back('i'); dfs(leno,leni+1,len); st.pop(); ve.pop_back(); } if(leno<leni && leno<len && t[leno]==st.top()){ char ch=st.top(); st.pop(); ve.push_back('o'); dfs(leno+1,leni,len); st.push(ch); ve.pop_back(); } } int main(){ while(cin>>s>>t){ string t1=s,t2=t; sort(t1.begin(),t1.end()); sort(t2.begin(),t2.end()); int len=s.length(); puts("["); if(t1==t2) dfs(0,0,len); puts("]"); } return 0; }