SRM607 div2 med PalindromicSubstringsDiv2
TopCoder Statistics - Match Overview
問題概要
- 文字列Sの中に回文が何個あるか
制約
- |S| ≦ 5000
解説
文字列Aが回文の時Aの両サイドに同じ文字が連結した文字列も回文となる。
同じ文字でない文字が連結したらその時点で回文では無くなる。
回文の中心がsiとなるような回文が何個あるかはO(|S|)で求められる。
よって中心の候補はO(|S|)なので、全体の計算量はO(|S|^2)で間に合う。
回文の長さが奇数の時と偶数の時で調べる必要がある。
コード
class PalindromicSubstringsDiv2 { public: int count(vector <string> S1, vector <string> S2) { string s = ""; FOR(i,0,S1.size()) s += S1[i]; FOR(i,0,S2.size()) s += S2[i]; int len = s.length(); int ret = 0; // even FOR(i,0,len) { int l = i, r = i + 1; while(l >= 0 && r < len && s[l] == s[r]) { ret++; l--; r++; } } // odd FOR(i,0,len) { int l = i, r = i; while(l >= 0 && r < len && s[l] == s[r]) { ret++; l--; r++; } } return ret; } };