zoukankan      html  css  js  c++  java
  • [hdu5371 Hotaru's problem]最大回文半径

    题意:在一个字符串里面找最长的[A][B][A]子串,其中[A][B]是回文串,[A]和[B]的长度相等

    思路:[A][B]是回文串,所以[B][A]也是回文串。先预处理出每个点的最大回文半径Ri,枚举[A][B]的对称轴位置p,那么就是要找最大的一个[B][A]的对称轴位置i,满足i<=p+R[p],i-R[i]<=p。由于p是递增的,先前满足的以后肯定满足,于是可以用set来维护i-R[i]<=p的所有的位置i的集合,并可在logN的时间内得到最大的位置i。

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #include <map>
    #include <set>
    #include <cmath>
    #include <ctime>
    #include <deque>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    #define X                   first
    #define Y                   second
    #define pb                  push_back
    #define mp                  make_pair
    #define all(a)              (a).begin(), (a).end()
    #define fillchar(a, x)      memset(a, x, sizeof(a))
    #define copy(a, b)          memcpy(a, b, sizeof(a))
    
    typedef long long ll;
    typedef pair<int, int> pii;
    typedef unsigned long long ull;
    
    //#ifndef ONLINE_JUDGE
    void RI(vector<int>&a,int n){a.resize(n);for(int i=0;i<n;i++)scanf("%d",&a[i]);}
    void RI(){}void RI(int&X){scanf("%d",&X);}template<typename...R>
    void RI(int&f,R&...r){RI(f);RI(r...);}void RI(int*p,int*q){int d=p<q?1:-1;
    while(p!=q){scanf("%d",p);p+=d;}}void print(){cout<<endl;}template<typename T>
    void print(const T t){cout<<t<<endl;}template<typename F,typename...R>
    void print(const F f,const R...r){cout<<f<<", ";print(r...);}template<typename T>
    void print(T*p, T*q){int d=p<q?1:-1;while(p!=q){cout<<*p<<", ";p+=d;}cout<<endl;}
    //#endif
    template<typename T>bool umax(T&a, const T&b){return b<=a?false:(a=b,true);}
    template<typename T>bool umin(T&a, const T&b){return b>=a?false:(a=b,true);}
    template<typename T>
    void V2A(T a[],const vector<T>&b){for(int i=0;i<b.size();i++)a[i]=b[i];}
    template<typename T>
    void A2V(vector<T>&a,const T b[]){for(int i=0;i<a.size();i++)a[i]=b[i];}
    
    const double PI = acos(-1.0);
    const int INF = 1e9 + 7;
    const double EPS = 1e-8;
    
    /* -------------------------------------------------------------------------------- */
    
    const int maxn = 2e5 + 7;
    
    struct StringHash {
        const static unsigned int hack = 79;
        //const static int maxn = 2e5 + 7;
        unsigned long long H[maxn], C[maxn];
        void init(int s[], int n) {
            for (int i = 0; i < n; i ++) {
                H[i] = (i? H[i - 1] * hack : 0) + s[i];
            }
            C[0] = 1;
            for (int i = 1; i <= n; i ++) C[i] = C[i - 1] * hack;
        }
        unsigned long long get(int L, int R) {
            return H[R] - (L? H[L - 1] * C[R - L + 1] : 0);
        }
    } ;
    StringHash hsh, hshrev;
    vector<int> G[maxn];
    int a[maxn], b[maxn], F[maxn];
    set<int> S;
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
    #endif // ONLINE_JUDGE
        int T, n, cas = 0;
        cin >> T;
        while (T --) {
            cin >> n;
            for (int i = 0; i < n; i ++) {
                scanf("%d", a + i);
            }
            hsh.init(a, n);
            for (int i = 0; i < n; i ++) b[i] = a[n - i - 1];
            hshrev.init(b, n);
            int total = 2 * n - 1;
            for (int i = 0; i < total; i ++) {
                int L = i / 2, R = (i + 1) / 2;
                int minlen = 0, maxlen = min(L + 1, n - R);
                while (minlen < maxlen) {
                    int midlen = (minlen + maxlen + 1) >> 1;
                    int lpos = L - midlen + 1, rpos = R + midlen - 1;
                    if (hsh.get(lpos, L) == hshrev.get(n - rpos - 1, n - R - 1)) 
                        minlen = midlen;
                    else maxlen = midlen - 1;
                }
                F[i] = minlen;
            }
            S.clear();
            for (int i = 0; i < n; i ++) G[i].clear();
            int ans = 0;
            for (int i = 0; i < n - 1; i ++) {
                 G[i - F[2 * i + 1] + 1].pb(i);
            }
            for (int i = 0; i < G[0].size(); i ++) S.insert(G[0][i]);
            for (int i = 1; i < total; i += 2) {
                int L = i / 2;
                for (int j = 0; j < G[L + 1].size(); j ++) S.insert(G[L + 1][j]);
                if (S.size()) {
                    set<int>::iterator R = S.upper_bound(L + F[i]); R --;
                    umax(ans, *R - L);
                }
            }
            printf("Case #%d: %d
    ", ++ cas, ans * 3);
        }
    
        return 0;
    }
    
  • 相关阅读:
    LevelDB的源码阅读(四) Compaction操作
    LevelDB的源码阅读(三) Get操作
    LevelDB的源码阅读(三) Put操作
    高级测试/测试开发技能
    IM测试功能点
    深入理解--SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用
    Jmeter非GUI分布式测试
    全套支付宝系统架构(内部架构图)【收藏】
    Jmeter
    报表类相关测试范围总结
  • 原文地址:https://www.cnblogs.com/jklongint/p/4724057.html
Copyright © 2011-2022 走看看