No.13 - POJ2570 状压求字符串并集

状态压缩:

注 : 这 题 有 大 量 的 输 出 操 作 , 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,醉了} printfcout 200msputchar 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 快!!!} putcharcoutcoutprintf

// 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值