zoukankan      html  css  js  c++  java
  • hdu4513--Manacher算法--回文串的O(n)算法

    腾讯的比赛的题目的质量都很高 特别喜欢这题目背景 每题都很有意思

    这题 也蛮难的 因为n太多了 一定要用O(n)的回文串算法来求

    我是在这里学习的  传送

    一般的话 都是char数组 使用特殊字符 表示插入 开头和末尾也是特别的字符 末尾的话是 ''

    这边的话 因为是Int数组  要注意下 0 和 末尾不能取相同值 这样会错的 插入的值 一定要在这个Height范围外

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int size = 100010;
     6 int height[size*2];
     7 int pos[size*2];
     8 
     9 int main()
    10 {
    11     cin.sync_with_stdio(false);
    12     int t , n , id , maxLen , ans;
    13     cin >> t;
    14     while( t-- )
    15     {
    16         cin >> n;
    17         height[0] = -3;
    18         for( int i = 1 ; i<=n ; i++ )
    19         {
    20             height[i*2-1] = -1;
    21             cin >> height[i*2];
    22         }
    23         height[n*2+1] = -1;
    24         height[n*2+2] = -2;
    25         n = n * 2 + 2;
    26         ans = maxLen = 0;
    27         for( int i = 1 ; i<n ; i++ )
    28         {
    29             if( maxLen > i )
    30             {
    31                 pos[i] = min( pos[id*2-i] , maxLen-i );
    32             }
    33             else
    34             {
    35                 pos[i] = 1;
    36             }
    37             while( height[ i+pos[i] ] == height[ i-pos[i] ] )
    38             {
    39                 if( height[ i+pos[i] ] == height[ i-pos[i] ] == -1 )
    40                 {
    41                     ++ pos[i];
    42                 }
    43                 else if( height[ i+pos[i] ] <= height[ i+pos[i]-2 ] )
    44                 {
    45                     ++ pos[i];
    46                 }
    47                 else
    48                     break;
    49             }
    50             if( i + pos[i] > maxLen )
    51             {
    52                 maxLen = i + pos[i];
    53                 id = i;
    54             }
    55         }
    56         for( int i = 0 ; i<n ; i++ )
    57         {
    58             ans = max( ans , pos[i]-1 );
    59         }    
    60         cout << ans << endl;
    61     }
    62     return 0;
    63 }
    View Code
    just follow your heart
  • 相关阅读:
    iOS学习13之OC NSString类
    iOS之08-核心语法
    iOS学习12之OC属性和点语法
    iOS学习11之OC继承
    iOS之07-三大特性之多态 + NSString类
    iOS学习10之OC类和对象
    swift(三)字典数组操作
    swift(二)swift字符串和字符和逻辑运算
    swift(二)swift字符串和字符和逻辑运算
    swift(一)基础变量类型
  • 原文地址:https://www.cnblogs.com/radical/p/4029683.html
Copyright © 2011-2022 走看看