← Home
#include<bits/stdc++.h>
using namespace std;
const int N=4e3+5,M=15;
int m,n,v,a[N],p,l,r,ok,len,vis[M],tot=1,ch[N][M],f[N][1<<12],val[N],fail[N],mx;
char s[N];
pair<int,int>pre[N][1<<12];
queue<int>q;
void insert(){
	int p=1,k;
	for(int i=l;i<=r;i++){
		if(!ch[p][k=a[i]]) ch[p][k]=++tot;
		p=ch[p][k];
	}
	val[p]+=v;
}
void getfail(){
	fill(ch[0],ch[0]+12,1),q.push(1);
	while(q.size()){
		int x=q.front(),y;
		val[x]+=val[fail[x]],q.pop();
		for(int i=0;i<12;i++){
			if((y=ch[x][i])) fail[y]=ch[fail[x]][i],q.push(y);
			else ch[x][i]=ch[fail[x]][i];
		}
	}
}
void dfs(int y,int t){
	if(!t) return ;
	auto p=pre[y][t];
	int x=p.first,i=p.second,s=t^(1<<i);
	dfs(x,s),putchar(i+'a');
}
signed main(){
	scanf("%d",&m);
	while(m--){
		scanf("%d%s",&v,s+1),n=strlen(s+1),p=l=r=12,ok=1;
		fill(vis,vis+12,0),fill(a+1,a+1+23,-1);
		for(int i=1;i<=n&&ok;i++){
			int k=s[i]-'a';
			if(i==1) a[p]=k;
			else if(vis[k]) a[p-1]==k?p--:(a[p+1]==k?p++:ok=0);
			else p==l?a[l=--p]=k:(p==r?a[r=++p]=k:ok=0);
			vis[k]=1;
		}
		if(!ok) continue;
		insert();
		if(r-l+1>1) reverse(a+l,a+1+r),insert();
	}
	getfail();
	memset(f,-0x3f,sizeof(f)),f[1][0]=0;
	for(int s=0;s<(1<<12);s++)
		for(int x=1;x<=tot;x++) if(f[x][s]>=0)
			for(int i=0;i<12;i++) if(!(s>>i&1)){
				int y=ch[x][i],t=s|(1<<i),tmp;
				if((tmp=f[x][s]+val[y])>f[y][t]) f[y][t]=tmp,pre[y][t]={x,i};
			}
	for(int i=1;i<=tot;i++)
		if(f[i][(1<<12)-1]>f[mx][(1<<12)-1]) mx=i;
	dfs(mx,(1<<12)-1);
	return 0;
}