題目鏈結
題意:給乙個長為 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寫譜的方式比較獨特。他會先寫出乙個按照音符出現順...