先把長度為k的字串雜湊掉,然後用可持久化線段樹判斷是否存在。。。
可持久化線段樹直接上模板,然而雜湊。。。
這裡有三種雜湊方法:①排個序,去個重,查詢的時候二分
②hash[i]=hash[i-1]*大質數+val[i]
③鬼畜查字元版雜湊
下面的**是第一種,然而加了讀入優化更慢是什麼鬼qaq
1 #include2 #include3 #include4view codeusing
namespace
std;56
#define maxn 100005
7int tot,tree[maxn*20],lson[maxn*20],rson[maxn*20
],root[maxn];
8int
nn,n,m,k,val[maxn],yooo[maxn],hash[maxn],pos[maxn];
9int
read()
17return
tmp;18}
19bool cmp(int x,int
y)24
return
false;25
}26int cmp2(int
x)31
return0;
32}33bool buyiyang(int x,int
y)38
void build(int x,int &y,int l,int r,int
val)
46else50}
51bool query(int x,int y,int l,int r,int
val)
58int
main()
65 sort(pos+1,pos+1+n,cmp);
66 hash[pos[1]]=++nn;
67for(int i=2;i<=n;i++)
71for(int i=1;i<=n-k+1;i++)
72 build(root[i-1],root[i],1
,nn,hash[i]);
73for(int i=1;i<=m;i++)
84if(!cmp2(pos[l])&&query(root[ql-1],root[qr-k+1],1,nn,hash[pos[l]]))printf("
no\n");
85else printf("
yes\n");
86}87return0;
88 }
bzoj 3207 花神的嘲諷計畫
題意 給出乙個長度為n的序列,有m個詢問 每次給出乙個區間 l,r 和乙個長度為k的短序列 查詢區間中是否存在這個子串 1 n 100000,1 m 100000,1 k 20 題中所有資料不超過2 10 9 保證方案序列的每個數字 n 題解 這題我讀了好幾遍沒讀懂,看了題解才知道這問的是查詢乙個固...
BZOJ 3207 花神的嘲諷計畫
背景 花神是神,一大癖好就是嘲諷大j,舉例如下 哎你傻不傻的!hqz 大笨j 這道題又被j屎過了!j這程式怎麼跑這麼快!j要逆襲了!描述 這一天dj在給吾等眾蒟蒻講題,花神在一邊做題無聊,就跑到了一邊跟吾等眾蒟蒻一起聽。以下是部分摘錄 1.j你在講什麼!我在講 哎你傻不傻的!這麼麻煩,直接 再 就好...
bzoj3207花神的嘲諷計畫
題意 給定乙個原字串和m個詢問,每次查詢原字串 l,r 內是否包含給定字串s len s 20且len s 相同 sol 考慮hash,將原串沒len s 位hash一次放入桶中,再將每次詢問hash後在桶中查詢 感覺很像rk hash 因為每次 l,r 轉移到 l,r 1 l 1,r 都是從桶中取...