General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
230466057 Practice:
racccccoon
1476E - 16 C++14 (GCC 6-32) Accepted 124 ms 30392 KB 2023-10-30 11:19:05 2023-10-30 11:19:05
→ Source
// LUOGU_RID: 132440046
#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
const int V=N,E=N*16;


struct edge{int to,nxt;};
edge e[E*2];int head[V],tot;
void add(int u,int v)
{
    e[++tot]={v,head[u]};head[u]=tot;
}

int n,m,k,limk,mt[N],id[531441+100];
char p[N][6],s[N][6];
int Hash(char *s)
{
    int res=0;
    for(int i=1;i<=k;i++)
        res*=27,res+=(s[i]=='_')?0:s[i]-'a'+1;
    return res;
}
int ans[N],cnt,indeg[N];queue<int>q;
void Push(int x){q.push(x),ans[++cnt]=x;}
bool topo()
{
    int vis=0;
    for(int i=1;i<=n;i++)
        if(!indeg[i])Push(i);
    while(!q.empty())
    {
        int u=q.front();q.pop();
        for(int i=head[u];i;i=e[i].nxt)
        {
            int v=e[i].to;
            if(!(--indeg[v]))Push(v);
        }
    }
    return cnt==n;
}
bool check(char *pp,char *ss)
{
    for(int i=1;i<=k;i++)
        if(pp[i]!='_'&&ss[i]!=pp[i])return false;
    return true;
}
void debug()
{
    return ;
    for(int i=1;i<=n;i++)
    {
        cout<<Hash(p[i])<<" ";
    }cout<<endl;
    for(int i=1;i<=m;i++)
    {
        cout<<Hash(s[i])<<" ";
    }cout<<endl;
}
int main()
{
    scanf("%d%d%d",&n,&m,&k);limk=(1<<k)-1;
    for(int i=1;i<=n;i++)
    {
        scanf("%s",p[i]+1);
        id[Hash(p[i])]=i;
    }
    char tmp[6];
    for(int i=1;i<=m;i++)
    {
        scanf("%s",s[i]+1);
        scanf("%d",&mt[i]);
        if(!check(p[mt[i]],s[i]))return puts("NO"),0;
        int u=Hash(p[mt[i]]),w=Hash(s[i]);
        // printf("\n\n for %d : \n",i);
        for(int j=0;j<=limk;j++)
        {
            bitset<4>b=j;
            for(int l=1;l<=k;l++)
            {
                if(j&(1<<(l-1)))
                    tmp[l]='_';
                else 
                    tmp[l]=s[i][l];
            }
            int v=Hash(tmp);
            if(u==v||id[v]==0)continue;
            // printf("%d %d\n",id[u],id[v]);
            add(id[u],id[v]);indeg[id[v]]++;
        }
    }
    // debug();
    if(topo())
    {
        puts("YES");
        for(int i=1;i<=cnt;i++)
            printf("%d ",ans[i]);puts("");
    }
    else 
    {
        puts("NO");
    }
    return 0;
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details