样例过了,全Wa,玄关
#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
int n,m;
int col[100001];
int ksm[100001];
int dfn[100001];
int low[100001];
int a[100001];
vector<int>p[100001];
int cntb[100001];
int cutb[100001];
int sumb[100001];
int cut[100001];
bool flag[100001];
int isflag[100001];
int ind[100001];
int cntbmap[100001];
string s;
int C,SCC;
const int mod=1e9+7;
void tarjan(int x,int fa)
{
col[x]=SCC;
if(a[x]==1)cutb[x]=cntb[x]=1;
dfn[x]=low[x]=++C;
for(int xx:p[x])
{
if(!dfn[xx])
{
tarjan(xx,x),low[x]=min(low[x],low[xx]);
cntb[x]+=cntb[xx];
if(low[xx]>=dfn[x])
{
cutb[x]+=cntb[xx];
++cut[x];
if(flag[x]||(cntb[xx]%2!=0))flag[x]=1;
}
}
else if(xx!=fa)low[x]=min(low[x],dfn[xx]);
}
if(!fa) --cut[x];
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
ksm[0]=1;for(int i=1;i<=100000;i++)ksm[i]=ksm[i-1]*2;
cin>>T;
while(T--)
{
cin>>n>>m;
C=0,SCC=0;
memset(dfn,0,sizeof(dfn));
memset(cut,0,sizeof(cut));
memset(ind,0,sizeof(ind));
memset(flag,0,sizeof(flag));
for(int i=0;i<m;++i)
{
int u,v; cin>>u>>v;
ind[u]++; ind[v]++;
p[u].push_back(v);
p[v].push_back(u);
}
cin>>s;
for(int i=1;i<=n;++i)a[i]=s[i-1]-'0';
int f=0;
for(int i=1;i<=n;++i)
if(dfn[i]==0)
{
++SCC,tarjan(i,0),f+=(cntb[i]&1);
cntbmap[SCC]=cntb[i];
isflag[SCC]=(cntbmap[SCC]&1);
}
int ans=m-n+SCC;
if(!f) cout<<ksm[ans];
else cout<<"0";
cout<<" ";
for(int i=1;i<=n;++i)
{
if(!ind[i])
{
if(f-cntb[i]==0) cout<<ksm[ans];
else cout<<"0";
cout<<" ";
}
else if(cut[i]==0)
{
if(isflag[col[i]]&&f-a[i]==0) cout<<ksm[ans-ind[i]+1+cut[i]];
else if(!isflag[col[i]]&&!f&&a[i]!=1) cout<<ksm[ans-ind[i]+1+cut[i]];
else cout<<"0";
cout<<" ";
}
else
{
bool Nflag=(!flag[i]&&(cntbmap[col[i]]-cutb[i])%2==0);
if(Nflag&&f-isflag[col[i]]==0) cout<<ksm[ans-ind[i]+1+cut[i]];
else cout<<"0";
cout<<" ";
}
}
cout<<'\n';
}
return 0;
}