#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
vector< string> Explode_L( const string & str, const string & d) {
int s = 0 ;
int i = 0 ;
int j;
vector< string> res;
while ( i + d.size ( ) - 1 < str.size ( ) ) {
for ( j= ( 0 ) ; j< ( d.size ( ) ) ; j++ ) {
if ( str[ i+ j] ! = d[ j] ) {
break ;
}
}
if ( j ! = d.size ( ) ) {
i++ ;
continue ;
}
res.push_back ( str.substr ( s, i- s) ) ;
s = ( i + = d.size ( ) ) ;
}
res.push_back ( str.substr ( s) ) ;
return res;
}
string Implode_L( const vector< string> & v, const string & d) {
int i;
string res;
if ( v.size ( ) == 0 ) {
return res;
}
res + = v[ 0 ] ;
for ( i= ( 1 ) ; i< ( v.size ( ) ) ; i++ ) {
res + = d;
res + = v[ i] ;
}
return res;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
map< string, int > mp;
string lis[ 10 ] [ 20 ] ;
int tot;
int sz[ 10 ] ;
vector< string> res;
vector< string> in;
vector< string> tmp;
void solve( int dep) {
int i;
int k;
if ( dep== in.size ( ) ) {
res.push_back ( Implode_L( tmp, " " ) ) ;
return ;
}
if ( mp.count ( in[ dep] ) == 0 ) {
solve( dep+ 1 ) ;
return ;
}
k = mp[ in[ dep] ] ;
for ( i= ( 0 ) ; i< ( sz[ k] ) ; i++ ) {
tmp[ dep] = lis[ k] [ i] ;
solve( dep+ 1 ) ;
}
}
class Solution{
public :
vector< string> generateSentences( vector< vector< string>> & S, string text) {
int i;
mp.clear ( ) ;
tot = 0 ;
for ( i= ( 0 ) ; i< ( 10 ) ; i++ ) {
sz[ i] = 0 ;
}
for ( i= ( 0 ) ; i< ( S.size ( ) ) ; i++ ) {
int j;
if ( mp.count ( S[ i] [ 0 ] ) ) {
continue ;
}
lis[ tot] [ sz[ tot] ++ ] = S[ i] [ 0 ] ;
mp[ S[ i] [ 0 ] ] = tot;
lis[ tot] [ sz[ tot] ++ ] = S[ i] [ 1 ] ;
mp[ S[ i] [ 1 ] ] = tot;
for ( j= ( i+ 1 ) ; j< ( S.size ( ) ) ; j++ ) {
if ( mp.count ( S[ j] [ 0 ] ) && mp.count ( S[ j] [ 1 ] ) ) {
continue ;
}
if ( mp.count ( S[ j] [ 0 ] ) ) {
lis[ tot] [ sz[ tot] ++ ] = S[ j] [ 1 ] ;
mp[ S[ j] [ 1 ] ] = tot;
continue ;
}
if ( mp.count ( S[ j] [ 1 ] ) ) {
lis[ tot] [ sz[ tot] ++ ] = S[ j] [ 0 ] ;
mp[ S[ j] [ 0 ] ] = tot;
continue ;
}
}
tot++ ;
}
res.clear ( ) ;
tmp = in = Explode_L( text, " " ) ;
solve( 0 ) ;
sort( res.begin ( ) , res.end ( ) ) ;
return res;
}
}
;
// cLay varsion 20191123-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// map<string, int> mp;
// string lis[10][20];
// int tot, sz[10];
// vector<string> res, in, tmp;
//
// void solve(int dep){
// int k;
// if(dep==in.size()) res.push_back( Implode(tmp, " ") ), return;
// if(mp.count(in[dep])==0) solve(dep+1), return;
// k = mp[in[dep]];
// rep(i,sz[k]) tmp[dep] = lis[k][i], solve(dep+1);
// }
//
// class Solution {
// public:
// vector<string> generateSentences(vector<vector<string>>& S, string text) {
// mp.clear();
// tot = 0;
// rep(i,10) sz[i] = 0;
//
// rep(i,S.size()){
// if(mp.count(S[i][0])) continue;
// lis[tot][sz[tot]++] = S[i][0]; mp[S[i][0]] = tot;
// lis[tot][sz[tot]++] = S[i][1]; mp[S[i][1]] = tot;
// rep(j,i+1,S.size()){
// if(mp.count(S[j][0]) && mp.count(S[j][1])) continue;
// if(mp.count(S[j][0])) lis[tot][sz[tot]++] = S[j][1], mp[S[j][1]] = tot, continue;
// if(mp.count(S[j][1])) lis[tot][sz[tot]++] = S[j][0], mp[S[j][0]] = tot, continue;
// }
// tot++;
// }
//
// res.clear();
// tmp = in = Explode(text, " ");
// solve(0);
// sort(res.begin(), res.end());
// return res;
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZlY3RvcjxzdHJpbmc+IEV4cGxvZGVfTChjb25zdCBzdHJpbmcgJnN0ciwgY29uc3Qgc3RyaW5nICZkKXsKICBpbnQgcyA9IDA7CiAgaW50IGkgPSAwOwogIGludCBqOwogIHZlY3RvcjxzdHJpbmc+IHJlczsKICB3aGlsZShpICsgZC5zaXplKCkgLSAxIDwgc3RyLnNpemUoKSl7CiAgICBmb3Ioaj0oMCk7ajwoZC5zaXplKCkpO2orKyl7CiAgICAgIGlmKHN0cltpK2pdICE9IGRbal0pewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZihqICE9IGQuc2l6ZSgpKXsKICAgICAgaSsrOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIHJlcy5wdXNoX2JhY2soc3RyLnN1YnN0cihzLCBpLXMpKTsKICAgIHMgPSAoaSArPSBkLnNpemUoKSk7CiAgfQogIHJlcy5wdXNoX2JhY2soc3RyLnN1YnN0cihzKSk7CiAgcmV0dXJuIHJlczsKfQpzdHJpbmcgSW1wbG9kZV9MKGNvbnN0IHZlY3RvcjxzdHJpbmc+ICZ2LCBjb25zdCBzdHJpbmcgJmQpewogIGludCBpOwogIHN0cmluZyByZXM7CiAgaWYodi5zaXplKCk9PTApewogICAgcmV0dXJuIHJlczsKICB9CiAgcmVzICs9IHZbMF07CiAgZm9yKGk9KDEpO2k8KHYuc2l6ZSgpKTtpKyspewogICAgcmVzICs9IGQ7CiAgICByZXMgKz0gdltpXTsKICB9CiAgcmV0dXJuIHJlczsKfQojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCm1hcDxzdHJpbmcsIGludD4gbXA7CnN0cmluZyBsaXNbMTBdWzIwXTsKaW50IHRvdDsKaW50IHN6WzEwXTsKdmVjdG9yPHN0cmluZz4gcmVzOwp2ZWN0b3I8c3RyaW5nPiBpbjsKdmVjdG9yPHN0cmluZz4gdG1wOwp2b2lkIHNvbHZlKGludCBkZXApewogIGludCBpOwogIGludCBrOwogIGlmKGRlcD09aW4uc2l6ZSgpKXsKICAgIHJlcy5wdXNoX2JhY2soSW1wbG9kZV9MKHRtcCwgIiAiKSk7CiAgICByZXR1cm47CiAgfQogIGlmKG1wLmNvdW50KGluW2RlcF0pPT0wKXsKICAgIHNvbHZlKGRlcCsxKTsKICAgIHJldHVybjsKICB9CiAgayA9IG1wW2luW2RlcF1dOwogIGZvcihpPSgwKTtpPChzeltrXSk7aSsrKXsKICAgIHRtcFtkZXBdID0gbGlzW2tdW2ldOwogICAgc29sdmUoZGVwKzEpOwogIH0KfQpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgdmVjdG9yPHN0cmluZz4gZ2VuZXJhdGVTZW50ZW5jZXModmVjdG9yPHZlY3RvcjxzdHJpbmc+PiYgUywgc3RyaW5nIHRleHQpewogICAgaW50IGk7CiAgICBtcC5jbGVhcigpOwogICAgdG90ID0gMDsKICAgIGZvcihpPSgwKTtpPCgxMCk7aSsrKXsKICAgICAgc3pbaV0gPSAwOwogICAgfQogICAgZm9yKGk9KDApO2k8KFMuc2l6ZSgpKTtpKyspewogICAgICBpbnQgajsKICAgICAgaWYobXAuY291bnQoU1tpXVswXSkpewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGxpc1t0b3RdW3N6W3RvdF0rK10gPSBTW2ldWzBdOwogICAgICBtcFtTW2ldWzBdXSA9IHRvdDsKICAgICAgbGlzW3RvdF1bc3pbdG90XSsrXSA9IFNbaV1bMV07CiAgICAgIG1wW1NbaV1bMV1dID0gdG90OwogICAgICBmb3Ioaj0oaSsxKTtqPChTLnNpemUoKSk7aisrKXsKICAgICAgICBpZihtcC5jb3VudChTW2pdWzBdKSAmJiBtcC5jb3VudChTW2pdWzFdKSl7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYobXAuY291bnQoU1tqXVswXSkpewogICAgICAgICAgbGlzW3RvdF1bc3pbdG90XSsrXSA9IFNbal1bMV07CiAgICAgICAgICBtcFtTW2pdWzFdXSA9IHRvdDsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZihtcC5jb3VudChTW2pdWzFdKSl7CiAgICAgICAgICBsaXNbdG90XVtzelt0b3RdKytdID0gU1tqXVswXTsKICAgICAgICAgIG1wW1Nbal1bMF1dID0gdG90OwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRvdCsrOwogICAgfQogICAgcmVzLmNsZWFyKCk7CiAgICB0bXAgPSBpbiA9RXhwbG9kZV9MKHRleHQsICIgIik7CiAgICBzb2x2ZSgwKTsKICAgIHNvcnQocmVzLmJlZ2luKCksIHJlcy5lbmQoKSk7CiAgICByZXR1cm4gcmVzOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDE5MTEyMy0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIG1hcDxzdHJpbmcsIGludD4gbXA7Ci8vIHN0cmluZyBsaXNbMTBdWzIwXTsKLy8gaW50IHRvdCwgc3pbMTBdOwovLyB2ZWN0b3I8c3RyaW5nPiByZXMsIGluLCB0bXA7Ci8vIAovLyB2b2lkIHNvbHZlKGludCBkZXApewovLyAgIGludCBrOwovLyAgIGlmKGRlcD09aW4uc2l6ZSgpKSByZXMucHVzaF9iYWNrKCBJbXBsb2RlKHRtcCwgIiAiKSApLCByZXR1cm47Ci8vICAgaWYobXAuY291bnQoaW5bZGVwXSk9PTApIHNvbHZlKGRlcCsxKSwgcmV0dXJuOwovLyAgIGsgPSBtcFtpbltkZXBdXTsKLy8gICByZXAoaSxzeltrXSkgdG1wW2RlcF0gPSBsaXNba11baV0sIHNvbHZlKGRlcCsxKTsKLy8gfQovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgdmVjdG9yPHN0cmluZz4gZ2VuZXJhdGVTZW50ZW5jZXModmVjdG9yPHZlY3RvcjxzdHJpbmc+PiYgUywgc3RyaW5nIHRleHQpIHsKLy8gICAgIG1wLmNsZWFyKCk7Ci8vICAgICB0b3QgPSAwOwovLyAgICAgcmVwKGksMTApIHN6W2ldID0gMDsKLy8gCi8vICAgICByZXAoaSxTLnNpemUoKSl7Ci8vICAgICAgIGlmKG1wLmNvdW50KFNbaV1bMF0pKSBjb250aW51ZTsKLy8gICAgICAgbGlzW3RvdF1bc3pbdG90XSsrXSA9IFNbaV1bMF07IG1wW1NbaV1bMF1dID0gdG90OwovLyAgICAgICBsaXNbdG90XVtzelt0b3RdKytdID0gU1tpXVsxXTsgbXBbU1tpXVsxXV0gPSB0b3Q7Ci8vICAgICAgIHJlcChqLGkrMSxTLnNpemUoKSl7Ci8vICAgICAgICAgaWYobXAuY291bnQoU1tqXVswXSkgJiYgbXAuY291bnQoU1tqXVsxXSkpIGNvbnRpbnVlOwovLyAgICAgICAgIGlmKG1wLmNvdW50KFNbal1bMF0pKSBsaXNbdG90XVtzelt0b3RdKytdID0gU1tqXVsxXSwgbXBbU1tqXVsxXV0gPSB0b3QsIGNvbnRpbnVlOwovLyAgICAgICAgIGlmKG1wLmNvdW50KFNbal1bMV0pKSBsaXNbdG90XVtzelt0b3RdKytdID0gU1tqXVswXSwgbXBbU1tqXVswXV0gPSB0b3QsIGNvbnRpbnVlOwovLyAgICAgICB9Ci8vICAgICAgIHRvdCsrOwovLyAgICAgfQovLyAKLy8gICAgIHJlcy5jbGVhcigpOwovLyAgICAgdG1wID0gaW4gPSBFeHBsb2RlKHRleHQsICIgIik7Ci8vICAgICBzb2x2ZSgwKTsKLy8gICAgIHNvcnQocmVzLmJlZ2luKCksIHJlcy5lbmQoKSk7Ci8vICAgICByZXR1cm4gcmVzOwovLyAgIH0KLy8gfTsK