zoukankan      html  css  js  c++  java
  • BZOJ 2342 & manachar+最优性剪枝

    题意:

      求最长回文串,串的两边都是回文串.

    Solution:

      manachar预处理然后暴力找...

    Code:

      

    #include <iostream>  
    #include <cstdio>  
    #include <cmath>  
    #include <algorithm>  
    #include <cstring>  
    #define MAXN 1000005  
    using namespace std;  
    int n, p[MAXN], f[MAXN], ans;  
    char s[MAXN];  
    int main()  
    {  
        scanf("%d", &n);  
        scanf("%s", s + 1);  
        for(int i = n; i; i --)s[i * 2] = s[i], s[i * 2 - 1] = '*';  
        s[0] = '#'; s[2 * n + 1] = '*';  
        int k = 0;  
        for(int i = 2; i <= 2 * n + 1; i ++){  
            if(k + p[k] - 1 < i)p[i] = 1;  
            else p[i] = min(p[2 * k - i], k + p[k] - i);  
            while(s[i + p[i]] == s[i - p[i]])p[i] ++;  
            if(i + p[i] > k + p[k])k = i;    
        }  
        for(int i = 1; i <= n; i ++)f[i] = (p[i * 2 + 1] - 1) / 2;  
        for(int i = 1; i <= n; i ++)  
            for(int j = f[i] / 2; j && j * 4 > ans; j --)  
                if(f[i - j] >= j && f[i + j] >= j)ans = max(ans, j * 4);  
        cout << ans << endl;  
        return 0;  
    }  
    
  • 相关阅读:
    C++ 共用体
    C++ 作用域内枚举
    C++ 作用域为类的常量
    C++ 类作用域
    C++ 对象数组
    C++ this指针
    C++ const成员函数
    C++ 对象的初始化和赋值
    C++ 析构函数
    乌班图 之 apt命令 及 VMware共享文件夹
  • 原文地址:https://www.cnblogs.com/YCuangWhen/p/5418494.html
Copyright © 2011-2022 走看看