POJ 失败大赏

#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
const int N = 500,M = 250;
int n,e[N],ne[N],h[M],idx;
string ans;
vector<string> w;
bool st[M];

void init(){
    w.clear();
    memset(st,0,sizeof st);
    memset(ne,-1,sizeof ne);
    memset(h,-1,sizeof h);
    idx=0;
    ans.clear();
}

void add(int u,int v,string &s){
    e[idx]=v,w.push_back(s),ne[idx]=h[u],h[u]=idx++;
}

string comb(string &s,string &t){
    string res;
    int i=0,j=0,sle=s.size(),tle=t.size();
    while(i<sle && j<tle){
        if(s[i]==t[j])  res+=s[i],i++,j++;
        else    if(s[i]<t[j])
                    while(s[i]<t[j] && i<sle)    i++;
                else    while(s[i]>t[j] && j<tle)    j++;
    }
    return res;
}

void dfs(int u,int v,string s){
    string l=s;
    for(int i=h[u];i!=-1;i=ne[i]){
        int j=e[i];
        if(st[j])   continue;
        sort(w[i].begin(),w[i].end());
        s=comb(s,w[i]);
        if(j==v){
            ans+=s;
            s=l;
            continue;
        }
        st[j]=1;
        dfs(j,v,s);
        st[j]=0;
        s=l;
    }
}

int main(){
    ios::sync_with_stdio(false);
    cout.tie(NULL);
    while(cin >> n && n){
        init();
        int a,b;
        while(cin >> a >> b && a && b){
            string s;
            cin >> s;
            add(a,b,s);
        }
        while(cin >> a >> b && a && b){
            ans.clear();
            string s="abcdefghigklmnopqrstuvwxyz";
            st[a]=1;
            dfs(a,b,s);
            st[a]=0;
            if(ans.size()){
                bool m[26]={0};
                for(int i=0;i<ans.size();i++)
                    m[ans[i]-'a']=1;
                for(int i=0;i<26;i++)
                    if(m[i])    cout << (char)(i+'a');
                cout << endl;
            }
            else    cout << "-" << endl;
        }
        cout << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值