給出長度為n的序列,詢問[1,r]的字尾區間[i,r] (1<=i,i<=r)異或和大於等於k的區間的個數。異或可逆,[i,r]等於[1,i-1]異或[1,r],設字首和s,求滿足s[i-1]^s[r]>=k,由於不可移項,必須考慮s[r]和k的影響。考慮建立trie在上面查詢答案。考慮當先選0還是1,選了乙個異或後比k大則所有答案可以貢獻,當前相等則繼續比較,小於則放棄。詳細見code。
#include
#include
#include
#include
#include
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
using namespace std;
int const maxn=100000,maxq=100000;
int n,q,pon=1,ans[maxq+10],b[40],c[40],size[maxn*40+10],son[maxn*40+10][2];
long long a[maxn+10];
struct rec;
rec qu[maxq+10];
bool cmp(rec i,rec j)
int count(int now,int
pos)
int main()
insert(1,1);
}fd(j,30,1)
ans[qu[i].num]=count(1,1);
}fo(i,1,q)printf("%d\n",ans[i]);
return
0;}
BZOJ4598 Sdoi2016 模式字串
bzoj4598 求樹上滿足某些條件的點對,首先就可以想到點分治。然後又與什麼字串匹配有關。km p,ac 自動機 之類的好像不太好用。那就雜湊吧!新增答案的時候有兩種情況 那麼就分別維護從上到下的鏈和從下到上的鏈。不是所有鏈都存的,僅當 從該點到當前根的一段是若干個模式串的字首或者字尾 時才存。發...
HDU4598 Difference(差分約束)
題意 有乙個圖,給圖上每個頂點都賦乙個實數ai。如果存在乙個正整數t滿足下面兩個條件,這個圖就是乙個 difference 1.ai t。2.如果點i,j構成的邊在圖中存在,則 ai aj t 否則 ai aj 代表充要條件 給出圖,問這個圖是否是乙個 difference 思路 結合前兩個條件,顯...
JZOJ 交換 模擬
給出字串s和字串t,現在你要把s的某乙個字元和t的某乙個字元交換,使得交換之後的s至少要有三個連續相同的字元,交換之後的t也要有三個連續相同的字元。問有多少種不同的交換方式。第一行,乙個字串s。s只含有 r g b 三種字元,長度不超過50,不小於3。而且s任意兩個相鄰的字元都不相同。第二行,乙個字...