傳送門
真是個練習卡常的好題呢
題意:給定乙個串,讓後每次給定乙個區間,問這個區間的子區間為回文子區間有多少個。這裡的回文串是區間內字母重排之後是回文串即可。
既然重排之後是回文就行,那麼只需要知道這個區間內奇數的個數就行了。字母只有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.投資上,人多...
尚矽谷的每一天都是全新自我激勵的一天
接近乙個月的學習,也是離開家的近乙個月,隊家的思戀,對親人的觀念,但無法阻擋隊技術的深挖的腳步。在這裡的學習收到了之前同事,身邊的朋友,以及現在身邊同學和老師的疑問為什麼會放棄之前曾經擁有的,又為什麼會從零再次起步,追逐不可確定的明天,如果或者萬一的失敗,對自己帶來的壓力則是倍數增加。在這裡 尚矽谷...