本文最后更新于:3 years ago
模板来源:HKer_YM的博客
1.求最长回文长度或回文子串个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| inline int Manacher(string s) { memset(hw, 0, sizeof(hw)); int len = s.length(); string nowString = "$#"; for(int i = 0; i < len; i++){ nowString += s[i]; nowString += "#"; } nowString += "^"; len = nowString.length(); int maxRight = 0, mid = 0, maxAns = 0, numAns = 0; for(int i = 1; i < len; i++){ if(maxRight > i){ hw[i] = min(maxRight - i, hw[(mid<<1) - i]); } else{ hw[i] = 1; } while(nowString[i + hw[i]] == nowString[i - hw[i]]){ ++hw[i]; } if(i + hw[i] > maxRight){ maxRight = i + hw[i]; mid = i; } numAns += (hw[i] / 2); } return numAns; }
|
2.求最长的回文子串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| inline string Manacher(string s) { memset(hw, 0, sizeof(hw)); int len = s.length(); string nowString = "$#"; for(int i = 0; i < len; i++){ nowString += s[i]; nowString += "#"; } nowString += "^"; len = nowString.length(); int maxRight = 0, mid = 0, maxLen = 0, maxPoint = 0; for(int i = 1; i < len; i++){ if(maxRight > i){ hw[i] = min(maxRight - i, hw[(mid<<1) - i]); } else{ hw[i] = 1; } while(nowString[i + hw[i]] == nowString[i - hw[i]]){ ++hw[i]; } if(i + hw[i] > maxRight){ maxRight = i + hw[i]; mid = i; } if(hw[i] > maxLen){ maxLen = hw[i]; maxPoint = i; } } return s.substr((maxPoint - maxLen) / 2, maxLen - 1); }
|