下载的数据和WA的反馈不一样,求调Orz
  • 板块P2814 家谱
  • 楼主llamn
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/19 20:37
  • 上次更新2024/3/19 21:38:04
查看原帖
下载的数据和WA的反馈不一样,求调Orz
1038651
llamn楼主2024/3/19 20:37
#include <bits/stdc++.h>
#define eggy using
#define party namespace 
eggy party std;
int n,m,f[50001],q,t1,t2,i,j,k,lsl = 1,lshl = 1,gfl = 1,gx;
string ls,lsh[50001],input[50001];
bool fg,dbug = 0;
int getf(int gf);
void mg(int t1,int t2);
inline string zh(string a);
int gets(string a);
void print(int a[],int l);
int main()
{
    while(getline(cin,input[lsl]))
    {
        if (input[lsl].size() == 1) break;
        if (input[lsl][0] == '?' && gx == 0) gx = lsl-1;
        lsl++;
    }getchar();getchar();
    for (i = 1; i <= lsl; i++)
        f[i] = i;
    for (i = 1; i <= lsl; i++)
    {
        fg = 0;
        int l = 1,r = lshl,mid;
        while(l <= r)
        {
            mid = (l + r) / 2;
            if (zh(lsh[mid]) < zh(input[i]))
                l = mid + 1;
            else if (zh(lsh[mid]) > zh(input[i]))
                r = mid - 1;
            else
            {
                fg = 1;
                break;
            }
        }
        
        if (!fg)
            lsh[lshl++] = input[i];
        
    }lshl--;
    for (i = 1; i < lshl; i++)
        lsh[i] = zh(lsh[i]);
    sort(lsh + 1, lsh + lshl);
    while(1)
    {
        t1 = gets(input[gfl]);
        for (i = gfl+1; input[i][0] != '#' && input[i][0] != '$' && i <= gx; i++)
        {
            t2 = gets(input[i]);
            mg(t1,t2);
            if (dbug) printf("%d %d\n",t1,t2);
        }
        if(dbug) print(f,lshl-1);
        if (input[i][0] == '$') break;
        gfl = i;
    }
    for (i = 1; i < lshl; i++)
        f[i] = getf(f[i]);
    if (dbug)
    {
        for (i = 1; i < lshl; i++)
            cout << lsh[i] << endl;
        print(f,lshl-1);
    }
    //return 0;
    for (i = gx+1; i < lsl;i++)
        cout << zh(input[i]) << " " << lsh[getf(gets(zh(input[i])))] << endl;
    return 0;
}
int getf(int gf)
{
    if (f[gf] == gf) return gf;
    else 
    {
        f[gf] = getf(f[gf]);
        return f[gf];
    }
}
void mg(int t1,int t2)
{
    int t3 = getf(t1),t4 = getf(t2);
    if (t3 != t4)
    {
        f[t4] = t3;
    }
}
inline string zh(string a)
{
    if (a.size() == 7)
    {
        string b = "      ";
        int i;
        for (i = 1; i <= 6; i++)
        {
            b[i-1] = a[i];
        }
        return b;
    }
    return a;
}
int gets(string a)
{
    int l = 1,r = lshl,mid;
    while(l <= r)
    {
        mid = (l + r) / 2;
        if (zh(lsh[mid]) < zh(a))
            l = mid + 1;
        else if (zh(lsh[mid]) > zh(a))
            r = mid - 1;
        else
            return mid;
        if (dbug) printf("%d %d %d\n",l,r,mid);
    }
    return -1;
}
void print(int a[],int l)
{
    int i;
    for (i = 1; i <= l; i++)
    {
        printf("%d ",a[i]);
    }printf("\n");
    return;
}

2024/3/19 20:37
加载中...