At most only one connected block size is greater than $nk$, so use the hash table when the BFS only expand $nk$ step.
Time complexity $o (n^2k) $.
#include <cstdio>typedef long long ll;const int n=5001000,m=9999991;int n,m,lim,i,h=1,t,g[m],nxt[n],ed;ll v[N],a [N/5],q[n],x,s,t;char s[70];inline void del (LL x) {int u=x%m; v[ed]=x;nxt[ed]=g[u];g[u]=ed++;} inline void Add (ll x) {int u=x%m; for (int i=g[u];i;i=nxt[i]) if (v[i]==x) return; V[ed]=x;nxt[ed]=g[u];g[u]=ed++;q[++t]=x;} inline ll read () {ll t=0; scanf ("%s", s); for (int i=0;i<n;i++) t=t*2+s[i]-' 0 '; return t;} int main () {scanf ("%d%d", &n,&m); lim=n*m+5; Add (S=read ()); T=read (); For (i=0;i<m;i++) del (A[i]=read ()); while (H<=t&&t<=lim) {x=q[h++]; if (x==t) return puts ("TAK"), 0; for (i=0;i<n;i++) Add (x^ (1ll<<i)); } if (T<=lim) return puts ("NIE"), 0; for (h=1,t=ed=i=0;i<m;i++) g[i]=0; Add (T); For (i=0;i<m;i++) del (a[i]); while (H<=t&&t<=lim) {x=q[h++]; if (x==s) return puts ("TAK"), 0; for (i=0;i<n;i++) Add (x^ (1ll<<i)); } return puts (T<=lim? ") NIE ":" TAK "), 0;}
bzoj3421:poi2013 Walk