病毒()

#include<bits/stdc++.h>
using namespace std;

#define N 50005

int k;
char ch[N][100];
char a[N];
int mp[N][100],in[N],out[N];
char ans[N];
int cnt;
queue<int> q;

inline int read()
{
	int x=0;
	bool f=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar())
		if(ch=='-')
			f=0;
	for(;isdigit(ch);ch=getchar())
		x=(x<<1)+(x<<3)+ch-'0';
	return f?x:(~(x-1));
}

int main()
{
	k=read();
	for(int i=1;i<=26;i++)
		in[i]=-1;
	for(int i=1;i<=k;i++)
	{
		scanf("%s",ch[i]);
	}
	scanf("%s",a);
	for(int i=0;i<strlen(a);i++)
	{
		in[a[i]-'a'+1]=0;
	}
	for(int i=1;i<k;i++)
	{
		int x=i+1;
		int len=min(strlen(ch[i]),strlen(ch[x]));
//		cout<<i<<" vs "<<x<<endl;
		for(int j=0;j<len;j++)
		{
			if(ch[i][j]==ch[x][j])continue;
			int o=ch[i][j]-'a'+1,p=ch[x][j]-'a'+1;
//			cout<<o<<" "<<p<<endl;
			in[p]++;
			out[o]++;
			mp[o][out[o]]=p;
			break;
		}
	}
//	cout<<endl;
	for(int i=1;i<=26;i++)
	{
//		cout<<i<<" "<<in[i]<<endl;
		if(in[i]==0)
		{
			q.push(i);
//			cout<<(char)(i+'a'-1)<<endl;
			cnt++;
			ans[cnt]=i+'a'-1;
		}
	}
	if(cnt!=1)
	{
		cout<<0;
		return 0;
	}
	while(!q.empty())
	{
		int k=q.front();
		q.pop();
		for(int i=1;i<=out[k];i++)
		{
			int t=mp[k][i];
			in[t]--;
			if(in[t]==0)
			{
				q.push(t);
				cnt++;
				ans[cnt]=t+'a'-1;
			}
		}
	}
//	for(int i=1;i<=cnt;i++)
//	{
//		cout<<ans[i];
//	}
//	cout<<cnt;
//	if(cnt==k)
//	{cout<<"error"<<endl;
		for(int i=0;i<strlen(a);i++)
		{
			for(int j=1;j<=cnt;j++)
			{
				if(a[i]==ans[j])
				{
					cout<<(char)(j+'a'-1);
					break;
			 	}
					
			}
			
		}
//	}
	return 0;
}
————————
#include<bits/stdc++.h>
using namespace std;

#define N 50005

int k;
char ch[N][100];
char a[N];
int mp[N][100],in[N],out[N];
char ans[N];
int cnt;
queue<int> q;

inline int read()
{
	int x=0;
	bool f=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar())
		if(ch=='-')
			f=0;
	for(;isdigit(ch);ch=getchar())
		x=(x<<1)+(x<<3)+ch-'0';
	return f?x:(~(x-1));
}

int main()
{
	k=read();
	for(int i=1;i<=26;i++)
		in[i]=-1;
	for(int i=1;i<=k;i++)
	{
		scanf("%s",ch[i]);
	}
	scanf("%s",a);
	for(int i=0;i<strlen(a);i++)
	{
		in[a[i]-'a'+1]=0;
	}
	for(int i=1;i<k;i++)
	{
		int x=i+1;
		int len=min(strlen(ch[i]),strlen(ch[x]));
//		cout<<i<<" vs "<<x<<endl;
		for(int j=0;j<len;j++)
		{
			if(ch[i][j]==ch[x][j])continue;
			int o=ch[i][j]-'a'+1,p=ch[x][j]-'a'+1;
//			cout<<o<<" "<<p<<endl;
			in[p]++;
			out[o]++;
			mp[o][out[o]]=p;
			break;
		}
	}
//	cout<<endl;
	for(int i=1;i<=26;i++)
	{
//		cout<<i<<" "<<in[i]<<endl;
		if(in[i]==0)
		{
			q.push(i);
//			cout<<(char)(i+'a'-1)<<endl;
			cnt++;
			ans[cnt]=i+'a'-1;
		}
	}
	if(cnt!=1)
	{
		cout<<0;
		return 0;
	}
	while(!q.empty())
	{
		int k=q.front();
		q.pop();
		for(int i=1;i<=out[k];i++)
		{
			int t=mp[k][i];
			in[t]--;
			if(in[t]==0)
			{
				q.push(t);
				cnt++;
				ans[cnt]=t+'a'-1;
			}
		}
	}
//	for(int i=1;i<=cnt;i++)
//	{
//		cout<<ans[i];
//	}
//	cout<<cnt;
//	if(cnt==k)
//	{cout<<"error"<<endl;
		for(int i=0;i<strlen(a);i++)
		{
			for(int j=1;j<=cnt;j++)
			{
				if(a[i]==ans[j])
				{
					cout<<(char)(j+'a'-1);
					break;
			 	}
					
			}
			
		}
//	}
	return 0;
}