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;
      }
原文地址:https://www.cnblogs.com/rootial/p/3539626.html