TC SRM 607 DIV2
求拼接完成后的字符串包含的子回文串的数目,一开始还用暴力去做,想都不用想 肯定超时了。
复习了一下求最长子回文串的算法,发现可以类似解决。
给相邻字符之间添加一个‘@’字符,这样所有的回文串都是奇数长度,然后从左到右,统计以每个字符为中心的回文串的数目就行了,长度逐渐递增,一旦遇到不是回文串的情况,就马上结束,开始对下一个字符为中心的回文串的统计。
Orz…这个回文串算法不久前学过,最近搞前面基础去了就忘得差不多了,还是太弱了,继续好好努力,先打好基础,同时学点新东西,我就不相信,acm这东西花时间是搞不好的。
代码:
int count(vector <string> S1, vector <string> S2){ string tempstr = "", str = ""; int n1= S1.size(), n2 = S2.size(); REP(i, n1) tempstr+= S1[i]; REP(i, n2) tempstr+= S2[i]; int ans = 0; int len = tempstr.size(); str += '@'; REP(i, len) { str += tempstr[i]; str += '@'; } cout<<str<<' '<<str.size()<<endl; len = 2*len+1; REP(i, len) REP(k, inf){ if(!(i + k < len && i - k >= 0)) break; if(str[i+k] == str[i-k]) ans += (str[i+k]!='@'); else break; } return ans; }