请求大佬教我对拍:是UVa的数据太弱了么?(UVa我AC了,洛谷WA #11)
查看原帖
请求大佬教我对拍:是UVa的数据太弱了么?(UVa我AC了,洛谷WA #11)
479172
Jay朝花夕拾楼主2023/1/11 17:00

本题是UVa10441 洛谷是单组数据版本,我的代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
using namespace std;

const int maxn = 30;
int ss, m, deg[maxn], cnt[2], head[maxn];
bool vis[maxn];
vector<string> edge[maxn];
stack<string> st;


int p[maxn];
int find(int x)//并查集
{return p[x] == x ? x : p[x] =  find(p[x]);}
void merge(int u, int v)//并
{
    u = find(u), v = find(v);
    p[u] = v;
}
bool same(int u, int v)//查
{return find(u) == find(v);}


void dfs(const string &s)
{
    int u = s[s.size() - 1] - 'a';
    for(int i = head[u]; i < (int)edge[u].size(); i = head[u])
    {
        head[u]++;
        dfs(edge[u][i]);
    }
    st.push(s);
}

int main()
{
    cin >> m;
    string s;
    while(m--)
    {
        cin >> s;
        int u = s[0] - 'a', v = s.back() - 'a';
        edge[u].push_back(s);
        deg[u]++, deg[v]--;
        if(!vis[u])
        {
            p[u] = u;
            vis[u] = 1;
            ss++;
        }
        if(!vis[v])
        {
            p[v] = v;
            vis[v] = 1;
            ss++;
        }
        if(!same(u, v))
        {
            merge(u, v);
            ss--;
        }
    }
    int S = -1;
    bool flag = 1;
    for(int u = 0; u < 26 && ss == 1; u++)
    {
        if(!deg[u])
            continue;
        else if(deg[u] == 1)
        {
            S = u;
            if(++cnt[0] > 1)
                break;
        }
        else if(deg[u] == -1)
        {
            if(++cnt[1] > 1)
                break;
        }
        else
        {
            flag = 0;
            break;
        }
    }
    if(ss != 1 || !flag || cnt[0] > 1 || cnt[1] > 1)
    {
        cout << "***";
        return 0;
    }
    for(int u = 0; u < 26; u++)
        sort(edge[u].begin(), edge[u].end());
    if(S == -1)
    {
        for(int u = 0; u < 26; u++)
            if(!edge[u].empty())
            {
                S = u;
                break;
            }
    }
    s = edge[S][0];
    head[S] = 1;
    dfs(s);
    cout << st.top();
    st.pop();
    while(!st.empty())
    {
        cout << '.' << st.top();
        st.pop();
    }
    return 0;
}

UVa是多组数据的版本,我改成多组数据之后(可AC)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <cstring>
using namespace std;

const int maxn = 30;
int ss, m, deg[maxn], cnt[2], head[maxn];
bool vis[maxn];
vector<string> edge[maxn];
stack<string> st;


int p[maxn];
int find(int x)//并查集
{return p[x] == x ? x : p[x] =  find(p[x]);}
void merge(int u, int v)//并
{
    u = find(u), v = find(v);
    p[u] = v;
}
bool same(int u, int v)//查
{return find(u) == find(v);}


void dfs(const string &s)
{
    int u = s[s.size() - 1] - 'a';
    for(int i = head[u]; i < (int)edge[u].size(); i = head[u])
    {
        head[u]++;
        dfs(edge[u][i]);
    }
    st.push(s);
}

void init()
{
    ss = 0;
    memset(deg, 0, sizeof deg);
    cnt[0] = cnt[1] = 0;
    memset(head, 0, sizeof head);
    memset(vis, 0, sizeof vis);
    for(int u = 0; u < 26; u++)
        edge[u].clear();

}
int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        init();
        string s;
        cin >> m;
        while(m--)
        {
            cin >> s;
            int u = s[0] - 'a', v = s.back() - 'a';
            edge[u].push_back(s);
            deg[u]++, deg[v]--;
            if(!vis[u])
            {
                p[u] = u;
                vis[u] = 1;
                ss++;
            }
            if(!vis[v])
            {
                p[v] = v;
                vis[v] = 1;
                ss++;
            }
            if(!same(u, v))
            {
                merge(u, v);
                ss--;
            }
        }
        int S = -1;
        bool flag = 1;
        for(int u = 0; u < 26 && ss == 1; u++)
        {
            if(!deg[u])
                continue;
            else if(deg[u] == 1)
            {
                S = u;
                if(++cnt[0] > 1)
                    break;
            }
            else if(deg[u] == -1)
            {
                if(++cnt[1] > 1)
                    break;
            }
            else
            {
                flag = 0;
                break;
            }
        }
        if(ss != 1 || !flag || cnt[0] > 1 || cnt[1] > 1)
        {
            cout << "***" << endl;
            continue;
        }
        for(int u = 0; u < 26; u++)
            sort(edge[u].begin(), edge[u].end());
        if(S == -1)
        {
            for(int u = 0; u < 26; u++)
                if(!edge[u].empty())
                {
                    S = u;
                    break;
                }
        }
        s = edge[S][0];
        head[S] = 1;
        dfs(s);
        cout << st.top();
        st.pop();
        while(!st.empty())
        {
            cout << '.' << st.top();
            st.pop();
        }
        cout << endl;
    }
    return 0;
}

大佬可以看看我哪里出了问题么...脑壳疼。。。或者教教我怎么对拍,我自己写的对拍数据生成器,跑了很久都没有对出来。。
```cpp
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int n = 26;
int ind[30], oud[30], m;
int main()
{
    srand(time(0));
    for(int u = 0; u < n; u++)
        oud[u] = ind[u] = rand() % 5, m += ind[u];
        
    int cnt = rand() % 3;
    m += cnt;
    while(cnt--)
    {
        int u = rand() % 26, v = rand() % 26;
        oud[u]++;
        ind[v]++;
    }
    printf("%d\n", m);
    while(m)
    {
        int u = rand() % 26, v = rand() % 26;
        if(oud[u] && ind[v])
        {
            printf("%c%c\n", u + 'a', v + 'a');
            oud[u]--;
            ind[v]--;
            m--;
        }
    }
    return 0;
}
2023/1/11 17:00
加载中...