1 条题解

  • 0
    @ 2025-10-8 16:50:40

    2024.09.29

    已修正数据并参照原数据添加Hack,Hack中最大化了开点数;

    关于空间大小:如果2*10^8开不下,请使用更节省空间的数据类型,

    由于01串长最大为64,会有大量重复的点,可以尝试dfs一下看看最多可能用到多少点

    ———Nanxl07

    #include <bits/stdc++.h>
    using namespace std;
    const int N=46100005;
    char ch[65],ex[N],ans[N];
    int n,a[N][2],cnt,g[65];
    int main(){
        scanf("%d", &n);
        for(int i=1;i<=n;i++){
            scanf("%s", ch+1);
            int k=strlen(ch+1), nw=0;
            for(int j=1;j<=k;j++){
                int p=ch[j]-'0';
                if(!a[nw][p])a[nw][p]=++cnt;
                nw=a[nw][p];
                g[j]=nw;
            }
            if(!ex[nw]){
                ex[nw]=1;
                for(int j=k-1;j>=1;j--){
                    int p=g[j];
                    if(ex[a[p][0]]!=1 && ex[a[p][1]]!=1)ex[p]=1;
                    else ex[p]=2;
                }
            }
            ans[i]=(ex[a[0][0]]==1||ex[a[0][1]]==1);
        }
        ans[n+1]=-1;
        int st=1;
        for(int i=2;i<=n+1;i++){
            if(ans[i]!=ans[i-1]){
                cout << (ans[i-1]?"Adam":"Eve") << ' ' << st << ' ' << i-1 << endl;
                st=i;
            }
        }
        return 0;
    }
    

    ———Nanxl07

    • 1

    信息

    ID
    442
    时间
    3000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    29
    已通过
    8
    上传者