不知道是不是我对这题理解不深,代码中加注释这里改成31,32就WA,30就对了,求教
#include<bits/stdc++.h>
#define int long long
#define inf 1e18
#define inc 0xcfcfcfcf
#define N 500007
#define M 37
#define mod 1000000007
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
using namespace std;
struct Edge
{
int to,nxt,val;
}edge[N<<1];
struct Trie
{
int ch[2];
}tr[N*100];
int T=1,n,m,k,ecnt,tcnt,ans=1;
int head[N],dis[N];
bool vis[N];
void Add(int u,int v,int w)
{
edge[++ecnt]=(Edge){v,head[u],w};
head[u]=ecnt;
}
void Insert(int val)
{
int now=0;
for(int i=30;i>=0;--i)//改成31,32就会错
{
int nxt=(val>>i)&1;
if(!tr[now].ch[nxt])
tr[now].ch[nxt]=++tcnt;
now=tr[now].ch[nxt];
}
}
void Dfs(int u,int fa,int val)
{
dis[u]=val;
vis[u]=1;
Insert(dis[u]);
if(!ans)
return;
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(v==fa)
continue;
if(vis[v])
{
if((val^edge[i].val)!=dis[v])
{
ans=0;
return;
}
continue;
}
Dfs(v,u,val^edge[i].val);
}
}
int Search(int now,int val,int pos)
{
if(val>k)
return 0;
if(pos<0)
return 1;
if(tr[now].ch[0]&&tr[now].ch[1])
return (Search(tr[now].ch[0],val+(1<<pos),pos-1)+Search(tr[now].ch[1],val+(1<<pos),pos-1))%mod;
int nxt=max(tr[now].ch[0],tr[now].ch[1]);
if((val+(1<<pos))<=k)
return (Search(nxt,val+(1<<pos),pos-1)+(1<<pos))%mod;
return Search(nxt,val,pos-1)%mod;
}
bool Solve()
{
//freopen("test.in","r",stdin);
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=m;++i)
{
int u,v,w;
scanf("%lld%lld%lld",&u,&v,&w);
Add(u,v,w);
Add(v,u,w);
}
for(int i=1;i<=n;++i)
{
if(vis[i])
continue;
Dfs(i,0,0);
ans*=Search(0,0,30);//改成31,32就会错
ans%=mod;
if(!ans)
break;
for(int j=0;j<=tcnt;++j)
tr[j].ch[0]=tr[j].ch[1]=0;
tcnt=0;
}
printf("%lld\n",ans);
return true;
}
signed main()
{
//scanf("%lld",&T);
while(T--)
if(!Solve())
printf("-1\n");
return 0;
}
/*
*/