破解
题目大意
问:
答案对
109
+
7
取模
题解
首先做差分。
每一位上的数变为和前面的那个数的异或值。做完差分后的数组每一种不同的情况都对应着原串的每一种不同的情况。
然后每个区间对应的操作只会改变查分数组的两个位置,分别为
对于每个区间,我们把
考虑连边。
如果一条边连接了两个不同的联通块,那么这个区间选将会导致当前全部方案都变成新的方案,所以此时答案翻倍(乘
连边操作以及联通块的维护可以用并查集。
Code(Pascal)
const
mo=1000000007;
var
fa:array[0..300000] of int64;
qq:array[0..300000,1..3] of int64;
qz:array[0..120000,1..2] of int64;
t,y,i,j,k,kk,l,n,m,o:longint;
ans:int64;
procedure qsort(l,r:longint);
var
i,j,m:longint;
begin
i:=l;
j:=r;
m:=qq[(l+r) div 2,1];
repeat
while qq[i,1]<m do inc(i);
while qq[j,1]>m do dec(j);
if i<=j then
begin
qq[0]:=qq[i];
qq[i]:=qq[j];
qq[j]:=qq[0];
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
function gf(o:longint):longint;
begin
if fa[o]=o then exit(o);
fa[o]:=gf(fa[o]);
exit(fa[o]);
end;
begin
readln(t);
for y:=1 to t do
begin
o:=0;
readln(n,m);
for i:=1 to m do
begin
readln(qz[i,1],qz[i,2]);
inc(o);
qq[o,1]:=qz[i,1];
qq[o,2]:=i;
qq[o,3]:=1;
inc(o);
qq[o,1]:=qz[i,2]+1;
qq[o,2]:=i;
qq[o,3]:=2;
end;
qsort(1,o);
k:=0;
kk:=0;
for i:=1 to o do
begin
if k<>qq[i,1] then
begin
inc(kk);
k:=qq[i,1];
end;
qz[qq[i,2],qq[i,3]]:=kk;
end;
j:=0;
for i:=1 to kk do
fa[i]:=i;
for i:=1 to m do
if gf(qz[i,1])<>gf(qz[i,2]) then
begin
inc(j);
fa[fa[qz[i,1]]]:=fa[qz[i,2]];
end;
ans:=1;
for i:=1 to j do
ans:=(ans*2) mod mo;
writeln(ans);
end;