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
原文地址:https://www.cnblogs.com/radical/p/4029683.html