zoukankan      html  css  js  c++  java
  • SPOJ7586 NUMOFPAL manacher算法

    题目大意:

    求一个串中有多少个回文子串

    这.....

    妥妥的模板题吧....

    对所有的$r[i] / 2$进行求和即可,其中,$r[i]$为以$i$为中心的回文半径

    $r[i] / 2$怎么来的,画下图就知道了...

    复杂度$O(n)$

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    #define ri register int
    #define rep(io, st, ed) for(ri io = st; io <= ed; io ++)
    
    const int sid = 4005;
    
    int n, m, ans;
    char s[sid], t[sid];
    int r[sid];
    
    int main() {
        scanf("%s", s + 1);
        n = strlen(s + 1);
        
        rep(i, 1, n) {
            t[++ m] = '#'; 
            t[++ m] = s[i];
        }
        t[++ m] = '#';
        
        r[1] = 1;
        int mr = 1, pos = 1;
        rep(i, 2, m) {
            r[i] = min(mr - i + 1, r[pos + pos - i]);
            while(i > r[i] && t[i + r[i]] == t[i - r[i]]) r[i] ++;
            if(i + r[i] - 1 > mr) mr = i + r[i] - 1, pos = i;
        }
        
        rep(i, 1, m) ans += r[i] / 2;
        printf("%d
    ", ans);
        return 0;
    }
  • 相关阅读:
    记账本开发第一天-补
    20200418-补
    20200411-补
    20200404-补
    20200328-补
    暴力解N皇后
    nN皇后递归
    Hanoi汉诺塔非递归栈解
    Hanoi汉诺塔递归
    JMMjmm模型
  • 原文地址:https://www.cnblogs.com/reverymoon/p/9960774.html
Copyright © 2011-2022 走看看