?
# | 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 |
// 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; }
?
?
?
?