124

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <queue>
#include <algorithm>
#include <cstring>
#include <set>

using namespace std;

int noOfelement;
int mp[26];
string str,str1,str2;
string output[2000];
int kk;
bool gr[27][27];
stringstream ss;
int elements[26];
set<string> SET;
//ofstream out;

bool check(int elemnt,bool visit[])
{
	for(int i=0;i<26;i++)
	{
		if(gr[i][elemnt] && mp[i]!=-1 && visit[mp[i]]==0)
		return 0;
	}
	return 1;
}

int recur(bool used[],string s)
{
	if(s.size()==noOfelement)
	{
		output[kk++]=s;
		//cout<<s<<"\n";
		//out<<s<<"\n";
		return 0;
	}

	for(int i=0;i<noOfelement;i++)
	{
		if(used[i]==0 && check(elements[i],used)==1)
		{
			used[i]=1;
			s.append(1u,char(elements[i]+'a'));
			recur(used,s);
			s.erase(s.begin()+(s.size()-1));
			used[i]=0;
		}
	}
	return 0;
}

void topologicalsort()
{
	bool visit[noOfelement];
	string res = "";
	for(int i=0;i<noOfelement;i++)
	{
		visit[i]=false;
	}
	for(int i=0;i<noOfelement;i++)
	{
		if(visit[i]==0 && check(elements[i],visit)==1)
		{
			visit[i]=1;
			res.append(1u,char(elements[i]+'a'));
			recur(visit,res);
			res.erase(res.begin()+(res.size()-1));
			visit[i]=0;
		}
	}

}

bool cmp(string s1,string s2)
{
	int sum = 0;
	for(int i=0;i<s1.size();i++)
	{
		if(s1[i]!=s2[i])
		{
			return (s1[i]<s2[i]);
		}
	}
}
int main()
{
	int cnt = 0;
	int a,b;
	bool first = 0;
	char c;

	while(getline(cin,str))
	{
		cnt+=1;
		if(cnt%2)
		{
			str1 = str;
			ss.clear();
			ss<<str1;
			for(int i=0;i<26;i++)
			{
				mp[i]=-1;
				elements[i]=0;
				for(int j=0;j<26;j++)
				gr[i][j]=0;
			}
			noOfelement=0;
			while(ss>>c)
			{
				mp[c-'a']=noOfelement;
				elements[noOfelement]=c-'a';
				noOfelement++;
			}
		}
		else
		{
			str2=str;
			ss.clear();
			ss<<str2;
			bool f = 0;
			while(ss>>c)
			{
				if(f)
				{
					b = c -'a';gr[a][b]=1;
				}
				else
				a = c-'a';
				f = !f;
			}
			kk=0;
			topologicalsort();
			if (first) cout<<"\n";
		    first = 1;
			sort(output+0,output+kk,cmp);
			for(int ii=0;ii<kk;ii++)
			{
				cout<<output[ii]<<"\n";
			}
		}
	}

	//out.close();
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *