马拉车算法(求最长回文子串)

 1 #include <vector>
 2 #include <iostream>
 3 #include <string>
 4 
 5 using namespace std;
 6 
 7 string Manacher(string s) {
 8     // Insert '#'
 9     string t = "$#";
10     for (int i = 0; i < s.size(); ++i) {
11         t += s[i];
12         t += "#";
13     }
14     // Process t
15     vector<int> p(t.size(), 0);
16     int mx = 0, id = 0, resLen = 0, resCenter = 0;
17     for (int i = 1; i < t.size(); ++i) {
18         p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
19         while (t[i + p[i]] == t[i - p[i]]) ++p[i];
20         if (mx < i + p[i]) {
21             mx = i + p[i];
22             id = i;
23         }
24         if (resLen < p[i]) {
25             resLen = p[i];
26             resCenter = i;
27         }
28     }
29     return s.substr((resCenter - resLen) / 2, resLen - 1);
30 }
31 
32 int main() {
33     int n;
34     cin>>n;
35     string k;
36      while(n--){
37     cin>>k;
38     cout<<Manacher(k).size()<<endl;
39 }
40     return 0;
41 }

http://hihocoder.com/problemset/problem/1015

转载于:https://www.cnblogs.com/wuruofeng/p/9954679.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值