zoukankan      html  css  js  c++  java
  • 洛谷 P3805 manacher算法

    链接:https://www.luogu.org/problemnew/show/P3805

    思路:模板,直接上马拉车

    代码:

     1 //#include<bits/stdc++.h>
     2 #include<iostream>
     3 #include<vector>
     4 #include<stack>
     5 #include<string>
     6 #include<cstdio>
     7 #include<algorithm>
     8 #include<queue>
     9 #include<map>
    10 #include<set>
    11 #include<cmath>
    12 #define inf 0x3f3f3f3f
    13 using namespace std;
    14 typedef long long ll;
    15 const ll M = ll(1e7) * 3 + 5;
    16 string s;
    17 string s2;
    18 ll len[M];
    19 string init(string s)
    20 {
    21     s2.clear();
    22     s2 += '@';
    23     for (ll i = 0; i < s.size(); i++)
    24     {
    25         s2 += '#';
    26         s2 += s[i];
    27     }
    28     //s2 += s[s.size() - 1];
    29     s2 += '#';
    30 //    s2 += '$';
    31 //    s2 += '';
    32     return s2;
    33 }
    34 ll Manacher(string s)
    35 {
    36     ll p0 = 0, mx = 0, ans = 0;
    37     for (ll i = 1; i < s.size(); i++)
    38     {
    39         if (i < mx)
    40             len[i] = min(mx - i, len[2 * p0 - i]);
    41         else
    42             len[i] = 1;
    43         while (s[i - len[i]] == s[i + len[i]])
    44             len[i]++;
    45         if (i + len[i] > mx)
    46         {
    47             mx = len[i] + i;
    48             p0 = i;
    49         }
    50         ans = max(ans, len[i]);
    51     }
    52     return ans - 1;
    53 }
    54 int main()
    55 {
    56     while (cin >> s)
    57     {
    58         s = init(s);
    59         //cout << s << endl;
    60         cout << Manacher(s) << endl;
    61     }
    62     return 0;
    63 }

    备注:在初始化原串的时候要注意还需要再加一个不同的字符,我这里用的是@,防止马拉车的时候上溢,详情可见这篇博客

    ————————————————
    心里有光,哪儿都美
  • 相关阅读:
    负数之美
    css重设
    编码问题
    wed的各种前端打印方法(3)CSS
    表单
    学习前端心得
    去除input,a,按键链接时出现的虚线方法
    加载事件js代码
    深入C#数据类型
    查找
  • 原文地址:https://www.cnblogs.com/harutomimori/p/10660935.html
Copyright © 2011-2022 走看看