zoukankan      html  css  js  c++  java
  • HDU 5487 Difference of Languages(BFS)

    HDU 5487 Difference of Languages

    这题从昨天下午2点开始做,到现在才AC了。感觉就是好多题都能想出来,就是写完后debug很长时间,才能AC,是不熟练的原因吗?但愿孰能生巧吧。

    BFS转移的是两个DFA的状态,用typedef pair<int,int> pi;map<pi,pi> pres;      两步储存前后状态的链接。

    附上一组测坑数据:

    /*
    432
    4 3 1
    3
    0 1 a
    1 2 e
    2 3 w
    6 3 1
    5
    0 1 a
    1 3 e
    3 5 h
    */

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <map>
    #include <queue>
    #include <vector>
    using namespace std;
    int n1,m1,k1;
    int n2,m2,k2;
    const int maxn = 1005;
    int ac1[maxn];
    int ac2[maxn];
    map<char,int> mp1;
    map<int,char> mp2;
    int g1[maxn][30];
    int g2[maxn][30];
    int vis[maxn][maxn];
    typedef pair<int,int> pi;
    map<pi,pi> pres;
    int a[maxn][maxn];
    int flag = 0;
    struct edge
    {
        int st1,st2;
    };
    edge ans;
    void pre()
    {
        for(int i=1;i<=26;i++)
        {
            char c = 'a'+i-1;
            mp1[c]=i;
            mp2[i]=c;
        }
    }
    void inin()
    {
        for(int i=0;i<maxn;i++)
        {
            ac1[i] = 0;
            ac2[i] = 0;
        }
        memset(g1,-1,sizeof(g1));
        memset(g2,-1,sizeof(g2));
        memset(vis,0,sizeof(vis));
        memset(a,0,sizeof(a));
        pres.clear();
    }
    bool check(int u,int c)
    {
        if(ac1[u]!=ac2[c])
            return false;
        return true;
    }
    void bfs()
    {
        queue<edge> q;
        edge cur;
        q.push((edge){0,0});
        ans = {0,0};
        flag = 0;
        while(!q.empty())
        {
            cur = q.front();
            q.pop();
            if(!check(cur.st1,cur.st2))
            {
                ans = cur;
                flag = 1;
                return;
            }
            for(int i=1;i<=26;i++)
            {
                int v1 = g1[cur.st1][i];
                int v2 = g2[cur.st2][i];
                if(!vis[v1][v2])
                {
                    vis[v1][v2] = 1;
                    q.push((edge){v1,v2});
                    pres[pi(v1,v2)] = make_pair(cur.st1,cur.st2);
                    a[v1][v2] = i;
                }
            }
        }
    }
    int main()
    {
        pre();
        int t;
        int kase = 0;
        cin>>t;
        while(t--)
        {
            int u,v,x;
            char c;
            inin();
            cin>>n1>>m1>>k1;
            for(int i=1;i<=k1;i++)
            {
                 scanf("%d",&x);
                 ac1[x] = 1;
            }
            for(int i=1;i<=m1;i++)
            {
                scanf("%d %d %c",&u,&v,&c);
                g1[u][mp1[c]] = v;
            }
            cin>>n2>>m2>>k2;
            for(int i=1;i<=k2;i++)
            {
                 scanf("%d",&x);
                 ac2[x] = 1;
            }
            for(int i=1;i<=m2;i++)
            {
                scanf("%d %d %c",&u,&v,&c);
                g2[u][mp1[c]] = v;
            }
            g1[0][0] = 0;
            g2[0][0] = 0;
            for(int i=0;i<=n1;i++)     //下面两步是防止 最后ac1[u]和ac2[c]索引为负。
                for(int j=1;j<=26;j++)
                if(g1[i][j]==-1) g1[i][j]=n1;
            for(int i=0;i<=n2;i++)
                for(int j=1;j<=26;j++)
                if(g2[i][j]==-1) g2[i][j]=n2;
            bfs();
            printf("Case #%d: ",++kase);
            if(!flag)
            {
                printf("0
    ");
                continue;
            }
            vector<int> buffer;
            pi cur;
            while(pres.count(pi(ans.st1,ans.st2))&&(ans.st1!=0||ans.st2!=0))
            {
                buffer.push_back(a[ans.st1][ans.st2]);
                cur = pres[pi(ans.st1,ans.st2)];
                ans.st1 = cur.first;
                ans.st2 = cur.second;
            }
            reverse(buffer.begin(),buffer.end());
            for(int i=0;i<buffer.size();i++)
            {
                printf("%c",buffer[i]+'a'-1);
            }
            printf("
    ");
        }
        return 0;
    }
    /*
    432
    4 3 1
    3
    0 1 a
    1 2 e
    2 3 w
    6 3 1
    5
    0 1 a
    1 3 e
    3 5 h
    */
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    SpringCloud Alibaba微服务实战一
    Bar:柱状图/条形图
    Pie:饼图
    Gauge:仪表盘
    Funnel:漏斗图
    VSCode+latex引用bibtex参考文献
    因为报表做得太好,我被阎王爷叫走了.....
    ubuntu安装pyCUDA
  • 原文地址:https://www.cnblogs.com/littlepear/p/5706312.html
Copyright © 2011-2022 走看看