zoukankan      html  css  js  c++  java
  • 马拉车算法(求最长回文子串)

     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

  • 相关阅读:
    接口测试01
    mysql主从
    linux下配置JDK
    linux常用命令
    mysql基本语句
    线程与进程
    loadrunner函数
    设计模式-模板方法模式
    设计原则-CRP合成复用原则
    设计原则-LOD迪米特法则
  • 原文地址:https://www.cnblogs.com/wuruofeng/p/9954679.html
Copyright © 2011-2022 走看看