給定乙個模板串
t ,字符集為。 有
q 個詢問,每次給出乙個串
s,字符集也只是上面四個字母,還會給定字符集中某些字母的奇偶性限制,詢問
s 中一共有多少個子串滿足以下兩個條件:
∙這個串是
t 的乙個子串
∙對於給定了奇偶性限制的字母,該串中中該字母出現的次數奇偶性要滿足這個限制1≤
|t|≤
105,∑
|s|≤
105,q
≤103
對t 串構造字尾自動機,然後拿詢問串在上面跑。
對於詢問串的乙個位置
i假設我們在sam上匹配到了節點
p ,任選ri
ghtp
中的任意乙個節點作為右端點
r ,可能的答案串左端點在區間[r
−mat
chle
n+1,
r]內,現在我們要滿足奇偶性限制。
既然字符集大小為
4 ,考慮使用
4位二進位制狀態來表示每個字元出現次數的奇偶性,我們處理一下字首和減一減就可以得到
i 對答案的貢獻。
時間複雜度o(
|t|+
2|σ|
|s|)
。
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
const
int n=100050;
const
int w=4;
const
int s=1
int v=n<<1;
int sum[n][s],pre[n];
int pur,cor;
namespace sam
sam[v];
int tot,root;
int newnode()
void init()
int insert(int lst,int c,int ps)
return np;
}int match(int &p,int c,int &len)
};char t[n],str[n],l[10];
int id[26];
int n,m,q;
int main()
for (ll ans;q--;printf("%lld\n",ans))
fclose(stdin),fclose(stdout);
return
0;}
GDKOI2014模擬 樹的直徑
並不想講。樹的直徑有乙個性質。現在有兩棵樹,如果把它們隨意連一條邊,會變成一棵樹,新樹的直徑的端點一定是之前兩棵樹的直徑的共4個端點的兩個。code include include define fo i,x,y for int i x i y i define fd i,x,y for int i...
GDKOI2014 石油儲備計畫
description input output 對於每組資料,輸出乙個整數,表示達到 平衡 狀態所需的最小代價。sample input 2 36 1 5 1 2 1 2 3 2 54 5 4 3 2 1 3 1 1 2 2 2 4 3 2 5 4 sample output 4 4樣例解釋 對於...
GDKOI2014 石油儲備計畫
description input output 對於每組資料,輸出乙個整數,表示達到 平衡 狀態所需的最小代價。sample input 2 36 1 5 1 2 1 2 3 2 54 5 4 3 2 1 3 1 1 2 2 2 4 3 2 5 4 sample output 4 4樣例解釋 對於...