牛客練習賽8 F題 莫隊演算法

2021-08-14 02:57:38 字數 1933 閱讀 7009

題目鏈結

題意:給乙個長為 n

nn 的只含小寫字母的字串

每次查詢乙個區間 $[l,r] $內,有多少子區間可以重排為乙個回文串。

思路:首先對於乙個可以重排為回文串的區間,一定滿足至多乙個字母的出現次數為奇數,其餘字母的出現次數為偶數。

因為只有26個小寫字母其只考慮出現次數的奇偶性,故可以考慮壓位2

262^

226 表示每乙個字母的出現情況。

對每一位求乙個字首和。

對於乙個新加入第x

xx個字母chch

ch,如果已知當前區間每乙個數的出現情況,則

a dd

=cnt

[sum

[x]]

+∑i=

025cn

t[su

m[x]

xor(

1<

]add = cnt[sum[x]] + \sum_^ cnt[sum[x] \ xor \ (1d=cn

t[su

m[x]

]+i=

0∑25

​cnt

[sum

[x]x

or(1

<

]離散化 + 莫隊可解。

**:

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int a =

1e5+10;

vector<

int> v;

int siz,sum[a]

,n,m;

ll ans[a]

,cnt[a]

,res;

char s[a]

;class

que}q[a]

;class

grag[a*50]

;int head[a]

,tot;

void

update

(int pos,

int c)

if(c ==

1) cnt[sum[pos]]+

= c;

}void

add(

int u,

int v)

void

solve()

}int

main()

sort

(v.begin()

,v.end()

);v.

erase

(unique

(v.begin()

,v.end()

),v.

end())

;int len = v.

size()

;memset

(head,-1

,sizeof

(head)

);tot =0;

for(

int i=

0;ifor(

int i=

0;i<=n ;i++

) sum[i]

=lower_bound

(v.begin()

,v.end()

,sum[i]

)- v.

begin()

;for

(int i=

1;i<=m ;i++

)sort

(q+1

,q+1

+m);

solve()

;for

(int i=

1;i<=m ;i++

)return0;

}

牛客練習賽58 F

求帶單點修改的樹上兩點間任意子路徑長異或和。路徑長等於路徑上所有異或和。簡單模擬一下,可以發現。奇數情況下,答案是偶數點異或和。偶數情況下,就是正常的異或和。偶數點異或和也很容易處理。分深度奇偶樹狀陣列即可。但是這是對於鏈的,不能直接dfs dfsdf s序,需要剖分一下。但是我不會,所以去學了一下...

牛客練習賽13 F 皇后

在乙個n n的西洋棋棋盤上有m個皇后。乙個皇后可以攻擊其他八個方向的皇后 上 下 左 右 左上 右上 左下 右下 對於某個皇后,如果某乙個方向上有其他皇后,那麼這個方向對她就是不安全的。對於每個皇后,我們都能知道她在幾個方向上是不安全的。現在我們想要求出t0,t1,t8,其中ti表示恰有i個方向是 ...

牛客練習賽40A題

題目描述 作為這命運劇場永遠的觀眾,小d一直注視著這片星光璀璨的舞台,舞台上,少女們的身姿演繹出了一幕幕動人的場景,令人回味無窮。有的時候,小d也會自己寫一些歌曲,來加入starlight的劇本,使得劇本充滿了新的生命力。現在小d又要準備寫樂譜了,小d寫譜的方式比較獨特。他會先寫出乙個按照音符出現順...