P3604 美好的每一天 莫隊 思維

2021-10-24 09:39:23 字數 1945 閱讀 8184

傳送門

真是個練習卡常的好題呢

題意:給定乙個串,讓後每次給定乙個區間,問這個區間的子區間為回文子區間有多少個。這裡的回文串是區間內字母重排之後是回文串即可。

既然重排之後是回文就行,那麼只需要知道這個區間內奇數的個數就行了。字母只有26個,那麼可以狀態壓縮一下,用乙個陣列記錄一下每一位即可。

既然只關心個數的奇偶,那麼可以用異或來判斷。區間異或顯然可以轉換成字首異或,假設當前區間為 [ x , y ] ,那麼需要選擇兩個數 i j ∈ [ x - 1 , y ] ,使其異或值為 0 (此時奇數個數為0) 或者2 ^ n (此時為奇數有乙個) 即可。而我假設 cnt 為記錄的字首異或和數量的陣列,加入當前要加的數為 a [ x ] ,那麼可以將 a [ x ] ^ ( 2 ^ n , n ∈ [ 0 , 25 ] ) 得到相應的數,加上其個數即可,讓後再加上跟自身相同的數個數 ( 也就是異或結果為0 )。這樣就解決了。

我不怎麼喜歡卡常好吧是我不會卡常 ,能過了就行了 ~ ~ ~

#pragma gcc optimize(2)

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define x first

#define y second

#define l (u<<1)

#define r (u<<1|1)

#define mid (tr[u].l+tr[u].r>>1)

#define len(u) (tr[u].r-tr[u].l+1)

#define pb push_back

#define mk make_pair

#define re register

#define il inline

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n=

60010

,mod=

1e9+

7,inf=

0x3f3f3f3f

;const

double eps=

1e-6

;int n,m;

int ans[n]

,cnt[(1

<<26)

+3],id[n]

,now,a[n]

;char s[n]

;struct node

q[n]

;il bool

cmp(node a,node b)

void

del(

int x)

void

add(

int x)

intmain()

for(re int i=

1;i<=m;i++

)scanf

("%d%d"

,&q[i]

.l,&q[i]

.r),q[i]

.id=i;

sort

(q+1

,q+1

+m,cmp)

;int l=

1,r=0;

for(re int i=

1;i<=m;i++

)for

(re int i=

1;i<=m;i++

)printf

("%d\n"

,ans[i]);

return0;

}/**/

P3604 美好的每一天

真 美好的每一天 美好個鬼啊 真 調了一下午 原因是,我之前移動指標時沒有先擴再縮,所以導致區間是負的 但是正常來說也沒事,可是這題卡常,桶我開的是unsigned short,於是區間是負的,自然桶中會有負數,負數爆成正的爽 霧 顯然一段區間是回文的當且僅當至多有乙個字母出現奇數次,於是我們嘗試用...

30歲前的每一天

夢想總是與你的價值觀相聯絡。你相信什麼,就會遇見什麼。職業規劃第一步,就是要知道 我能做什麼 職業規劃的第二步,就是要知道 這個職業的路徑是什麼 職業規劃第三步,我還能再做些什麼 讀書讀不懂,十之 是自身資質還未到此。讀書要循序漸進,坐享其成。投資建議 1.投資上,不懂得事情不要做 2.投資上,人多...

尚矽谷的每一天都是全新自我激勵的一天

接近乙個月的學習,也是離開家的近乙個月,隊家的思戀,對親人的觀念,但無法阻擋隊技術的深挖的腳步。在這裡的學習收到了之前同事,身邊的朋友,以及現在身邊同學和老師的疑問為什麼會放棄之前曾經擁有的,又為什麼會從零再次起步,追逐不可確定的明天,如果或者萬一的失敗,對自己帶來的壓力則是倍數增加。在這裡 尚矽谷...