題意: 定義 k 度回文串為左半部分和右半部分為 k - 1 度的回文串 . 給出乙個字串 s, 問 1 ~ s.size() 度回文串的數目分別為多少 .
思路: 預處理 + 記憶化dp
可以先花 o(n^2) 的時間預處理一下所有字串是否為回文串 . 注意預處理時不能直接列舉 l, r, 不然會出現處理 [l, r] 時 [l + 1, r - 1] 並沒有先處理的情況 .不過換個思路, 列舉長度和左端點就好了 .
然後可以直接 dfs 出所有字串的回文度, 因為對於回文串其左右部分是一樣的, 所以每次 dfs 一半即可,
這裡還可以加個記憶優化, 能將複雜度從 o(n * n * log(n)) 降到 o(n * n).
最後注意一下對於度為 k 的串, 其也是度為 1 ~ k - 1 的串 .
**:
1 #include 2view codeusing
namespace
std;34
const
int maxn = 5e3 + 10;5
int vis[maxn][maxn];//
vis[i][j]記錄[i,j]是否為回文串
6int dp[maxn][maxn];//
dp[i][j]記錄[i,j]的回文度
7int sol[maxn];//
sol[i]記錄回文度為i的子串數目89
int dfs(int l, int
r)17
18int main(void)27
for(int i = 3; i <= len; i++)31}
32for(int i = 0; i < len; i++)36}
37for(int i = len - 1; i > 0; i--)
40for(int i = 1; i <= len; i++)
43 cout <
44return0;
45 }
CF835C Star sky(模擬 二維字首和)
題目大意 給你個100 100的棋盤,有些點上有點權,會隨時間改變。設點權為x x 10 則在時間t他的點權為 t x c 1 每次詢問給你時間t,和乙個矩陣範圍 x1,y1,x2,y2 問你矩陣覆蓋區域內的點權和是多少。因為棋盤範圍很小,權值種類也很少,所以我們預處理乙個陣列cnt k x y 表...
c 預處理和預處理命令
預處理發生在編譯之前,預處理輸出的是乙個單一的檔案,這個檔案被送到編譯器,進行編譯。每條預處理命令都控制預處理器的行為。每條預處理命令佔據一行,有以下的格式 character 預處理命令 one of define,undef,include,if,ifdef,ifndef,else,elif,e...
mysql 預處理語句 in MySQL預處理語句
預製語句的sql語法基於三個sql語句 prepare stmt name from preparable stmt execute stmt name using var name var name prepare stmt name prepare語句用於預備乙個語句,並賦予它名稱stmt na...