TopCoder SRM 607 Div1 Easy PalindromicSubstringsDiv1
問題
文字列sの回文度とは、sの空でない連続する部分文字列のうち、回文であるものの個数を言う。
英小文字と'?'からなる文字列sが与えられる。
文字列中の'?'は等確率でa-zに変化する。このとき、sの回文度の期待値を求めよ。
制約条件
sの長さ≦5000
方針
回文を中心から伸ばしていくだけ。
長さが偶数奇数の場合にわけて、中心を全部試せばいい。
?と?、または?と文字が出たら確率は1/26。
違う文字が出たら確率は0になる。
ソースコード
class PalindromicSubstringsDiv1 { public: double expectedPalindromes(vector <string> S1, vector <string> S2) { string s; rep(i, S1.size()) s += S1[i]; rep(i, S2.size()) s += S2[i]; double ans = 0; rep(i, s.size()){ double p = 1; //odd ans++; for(int j = 1; ; j++){ if(i < j || i + j >= s.size()) break; int q = (s[i - j] == '?') + (s[i + j] == '?'); if(q == 0 && s[i - j] != s[i + j]) break; if(q != 0) p /= 26; ans += p; } p = 1; //even for(int j = 0; ; j++){ if(i < j || i + 1 + j >= s.size()) break; int q = (s[i - j] == '?') + (s[i + j + 1] == '?'); if(q == 0 && s[i - j] != s[i + j + 1]) break; if(q != 0) p /= 26; ans += p; } } return ans; } };