Description
一个只由小写字母组成的字符串,且每个小写字母最多出现一次,现在给出这个字符串的n个子串,求出符合条件的最短的合法串
Input
第一行一整数n表示给出的子串数量,之后给出n个子串
Output
输出满足条件的最短串
Sample Input
3
bcd
ab
cdef
Sample Output
abcdef
Solution
根据输入的子串得到每个字符串的前驱和后继,之后从到大找出现过的字符中没有前驱的开始输出即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define maxn 33
int n,pre[maxn],nex[maxn],flag[maxn];
char s[maxn];
int main()
{
while(~scanf("%d",&n))
{
memset(pre,-1,sizeof(pre));
memset(nex,-1,sizeof(nex));
memset(flag,0,sizeof(flag));
while(n--)
{
scanf("%s",s);
int len=strlen(s);
flag[s[0]-'a']=1;
for(int i=1;i<len;i++)
{
flag[s[i]-'a']=1;
pre[s[i]-'a']=s[i-1]-'a';
nex[s[i-1]-'a']=s[i]-'a';
}
}
for(int i=0;i<26;i++)
if(pre[i]==-1&&flag[i])
{
int j=i;
while(1)
{
flag[j]=0;
printf("%c",j+'a');
j=nex[j];
if(j==-1)break;
}
}
printf("\n");
}
return 0;
}