状态压缩:
注 : 这 题 有 大 量 的 输 出 操 作 , p r i n t f 超 时 , c o u t 200 m s , p u t c h a r 70 m s , 醉 了 \red{注:这题有大量的输出操作,printf超时,cout\ 200ms,putchar\ 70ms,醉了} 注:这题有大量的输出操作,printf超时,cout 200ms,putchar 70ms,醉了
p u t c h a r 要 比 c o u t 快 ! ! ! c o u t 要 比 p r i n t f 快 ! ! ! \orange{putchar 要比cout快!!!cout要比 printf 快!!!} putchar要比cout快!!!cout要比printf快!!!
// ShellDawn
// POJ2570
// No.13
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#define MM(x) memset(x,0,sizeof(x))
#define MMF(x) memset(x,0,sizeof(x))
using namespace std;
#define maxn 205
int n;
int E[maxn][maxn];
int cacu(const string& s){
int ans = 0;
int L = s.length();
for(int i=0;i<L;i++){
ans |= 1<<(s[i]-'a');
}
return ans;
}
void doit(int a,int b){
int mask = 1;
bool flag = false;
for(int i=0;i<26;i++){
if(mask & E[a][b] ) flag=true,putchar(i+'a');
mask <<= 1;
}
if(flag) puts("");
else puts("-");
}
void Floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
E[i][j] |= E[i][k] & E[k][j];
}
}
}
}
int main(){
int T = 0;
while(~scanf("%d",&n)&&n!=0){
if(T++) puts("");
MM(E);
int a,b;
while(~scanf("%d%d",&a,&b)&&a!=0){
string s;
cin>>s;
E[a][b] = cacu(s);
}
Floyd();
while(~scanf("%d%d",&a,&b)&&a!=0) doit(a,b);
}
return 0;
}