九校3D2T2 交錯的字串

2021-08-28 22:57:18 字數 1233 閱讀 9835

mark douglas是一名律師。他的客戶yuri ball在一場車禍中不幸去世。為了幫助yuri的親屬拿到他的遺產,mark需要得到乙個密碼。在yuri的筆記本上,有乙個長為2n的只包含小寫字母的字串,mark知道密碼恰好是將這個字串分解為兩個長度為n的子串行且它們構成的字串恰好相反的方案數。我們認為兩種分解方法是不同的,當且僅當兩個下標集合構成的集合是不同的,注意和我們認為是相同的分解方法。如cabaacba的合法分解共有cabaacba和cabaacba兩種。mark希望你能幫助他計算出密碼,事成之後他決定分給你six million five hundred thousand dollars並邀請你去柬埔寨度假。

輸入檔名為string.in。

第一行為乙個正整數n。

第二行為乙個長度為2n的字串,僅包含小寫字母。

輸出檔名為string.out。

輸出僅一行表示答案。

cabaacba

【資料範圍】

對於1~7號測試點(28%):1<=n<=10。

對於8~10號測試點(12%):字串中僅有小寫字母a。

對於11~14號測試點(16%):字串中除去兩個b外其餘全是a。

對於15~18號測試點(16%):字串中僅有a, b兩種字元。

對於所有測試點(100%):1<=n<=18。

折半列舉。小技巧左邊h1+右邊h1'=左邊h0+右邊h0'->h1-h0=h0'-h1',這樣列舉出前一半了後面一半o(1)計算,時間複雜度2^n

需要注意的是因為涉及減法?所以單雜湊也許會錯。

#includeusing namespace std;

typedef long long ll;

const int maxn=45;

const ll e1=233,p1=1e9+7,e2=131,p2=998244353;

ll f1[maxn]=,f2[maxn]=;

char s[maxn];

int n,tot;

map,ll>count;

int main()else

++count[make_pair(_h1-_h0,h1_-h0_)];

} long long ans=0;

for(int i=0;i<=tot;++i)else

ans+=count[make_pair(_h0-_h1,h0_-h1_)];

} cout

}

九校2D2T1 旋轉子段

zyl有n張牌編號分別為1,2,n。他把這n張牌打亂排成一排,然後他要做一次旋轉使得旋轉後固定點盡可能多。如果第i個位置的牌的編號為i,我們就稱之為固定點。旋轉可以被認為是將其中的乙個子段旋轉180度,這意味著子段的第一張牌和最後一張牌交換位置,以及第二張牌和倒數第二張牌交換位置,等等。寫乙個程式,...

九校聯考DAT2T3 啟發式合併,倍增

南極的企鵝王國大學中生活著 n 只企鵝,作為 21 世紀的優秀大學生,企鵝們積極響應 大眾創業,萬眾創新 的號召,紛紛創業。但是創業需要資 金,企鵝們最近手頭比較緊,只能互相借錢。企鵝的借錢行為是有規律可循的 每只企鵝只會借一次錢,並且只會 從乙隻企鵝那裡借錢。借錢關係中不存在環 即不存在類似 金企...

CSP S2019 D2T3 樹的重心

小簡單正在學習離散數學,今天的內容是圖論基礎,在課上他做了如下兩條筆記 乙個大小為 n nn 的樹由 n nn 個結點與 n 1 n 1 n 1 條無向邊構成,且滿足任意兩個結點間有且僅有一條簡單路徑。在樹中刪去乙個結點及與它關聯的邊,樹將 為若干個子樹 而在樹中刪去一條邊 保留關聯結點,下同 樹將...