最容易想到的辦法是通過記錄每個字串中每個字母出現的次數,然後將所有n個字串進行各種組合,確定最多可選擇的字串數。但是這樣的複雜度為2的n次方,肯定不行。
所以想到用類似於字首和的方式,遍歷所有字串過程中,判斷當前遍歷到的字串的狀態與之前某位置字串狀態是否相同。
對於狀態而言,可以用狀壓來完成,實際上也就是借用二進位制串的方式,將當前字串中每個字母出現的次數記錄,並將26個字母的出現次數這樣乙個狀態轉換為乙個數,可能出現的最大的數是3的26次方,所以宣告long long型來儲存。
確定了狀態後,我們只需要用unordered_map雜湊表記錄每個遍歷到的字串的狀態,並在遍歷過程中每次檢查當前狀態是否之前出現過,若出現過說明這兩個位置之間的所有字串合在一起,所有字母出現的次數都是3的整數倍。
特判一下狀態值為0的情況,此時遍歷到的字串之前所有的字串合到一起也滿足條件。
#include
using
namespace std;
typedef
long
long ll;
int x[26]
;ll check()
return res;
}int
main()
ll pos =
check()
;//cout << "pos = " << pos << endl;
if(pos ==0)
else
if(mp[pos]
>0)
else
} cout << res << endl;
}
牛客等級之題N1(8 4場)購物
題目鏈結 在遙遠的東方,有一家糖果專賣店。這家糖果店將會在每天 一些糖果,它每天都會生產出m個糖果,第i天的第j個糖果 為c i j 元。現在的你想要在接下來的n天去糖果店進行選購,你每天可以買多個糖果,也可以選擇不買糖果,但是最多買m個。因為最多隻生產m個 買來糖果以後,你可以選擇吃掉糖果或者留著...
牛客等級之題N2
目錄牛客等級之題n2 8.3場 設大半圓的半徑為 r 左小半圓半徑為 r r kr 0 pi r 2 pi k 2r 2 pi r kr 2 2s r 2 k k 2 frac k frac 時 r 2 最小 include using namespace std const double pi a...
牛客等級之題N1(8 4場) 購物 dp動態規劃
在遙遠的東方,有一家糖果專賣店。這家糖果店將會在每天 一些糖果,它每天都會生產出m個糖果,第i天的第j個糖果 為c i j 元。現在的你想要在接下來的n天去糖果店進行選購,你每天可以買多個糖果,也可以選擇不買糖果,但是最多買m個。因為最多隻生產m個 買來糖果以後,你可以選擇吃掉糖果或者留著之後再吃。...