質問の意味:
あなたの0と1の、そしてあなたに1内部の部分文字列の数を教えてくれ、との言葉が正しい、とどこ以前の矛盾した言葉をお願いすることを前提とする文字列。
ソリューション:
まず、nは偉大な発見が、問題はかなりの数m、その第1の離散あります
Dは、シーケンスSプレフィックスアレイと表し、
D [L〜R]は、D [L-1]、D [R&LT]同じパリティを有するように1当量の偶数を有する。を
D [L〜R]は、奇数1とD [L-1]、D [R]異なるパリティと等価です。
すなわち、同じパリティは、排他的または奇数異なる偶数パリティのXORであるその後、排他的に通過されるか、上記の関係を満たすように
方法と組み合わせることで設定 間違っているどのように多くの回答 に類似
[I、A]及び[I、B]がパリティに[I ^ A-1]限り[B、i]のように決定された存在する場合、D [i]は、Iに1を表し、そして
したがって、(実際にはD [i]のにルートノードとみなすことができる共通のポイント互いに素なセットのルートノードを維持Iの距離)
それでは、どのコレクションをマージするには?
FX年度、すなわち向けてみましょう F [FY] = FXを、 として D [FX] ^ D [X ] ^ D [y]は[I] .ans = そう ^ D [FX] D [X ] ^ D [Y] = [I] .ans
コード:
#include <iostreamの> する#include <stdio.hに> する#include <math.h>の 書式#include <アルゴリズム> の#include <ベクトル> 使用して 名前空間STD。 typedefの長い 長いLL。 const int型 MAXN = 2E5 + 7 。 ベクトル < int型 > V。 INT F [MAXN]、D [MAXN]。 INT GET_ID(INT X){ 戻り LOWER_BOUND(v.begin()、v.end()、x)は-v.begin()+ 1 ;} 構造体ノード { int型のL、R、ANS。 } [MAXN]。 int型(見つけるINT X) { 場合(F [X] == x)をリターンX。 INTのルート= 検索(F [X])。 D [X] ^ = D [F [X]]。 戻り [X] = F ルート。 } int型のmain() { int型、N M。 scanf関数(" %d個の%のD "、&N、&M)。 以下のために(int型私= 1 ; I <= M; iが++ ) { チャー STR [ 10 ]。 scanf関数(" %D%D%S "、および[I] .L& [I] .R、STR)。 v.push_back([I] .L - 1 )。 v.push_back([I] .R)。 [I] .ans =(STR [ 0 ] == ' E '?0:1 )。 } ソート(v.begin()、v.end())、v.erase(ユニーク(v.begin()、v.end())、v.end())。 用(int型 iは= 1 [I] = I、Dの[I] = F; I <= v.size()は、i ++)は0 。 INT RES = M。 以下のために(int型 I = 1 ; I <= M; iは++ ) { int型のx = GET_ID([I] .l- 1 )。 INT Y = GET_ID([I] .R)。 int型の FX = (x)の検索; int型 FY = (y)を見つけます。 もし(FX == 年度) { もし、((D [X] ^ D [Y])!= [I] .ans) { RES = I- 1 。 破ります; } } 他 { F [FX] = FY。 D [FX] ^ = D [X] ^ D [Y] ^ [i]は.ans。/// D [FX] ^ D [X] ^ D [y]は[I] .ans = } } のprintf(" %d個の\ nを" 、RES); 戻り 0 ; }