Manncherアルゴリズム

元のタイトル:https://vjudge.net/problem/UVA-11475

非常に標準回文文字列問題(なぜ常にいくつかの場所で奇妙な間違いました...)

#include <iostreamの> 
する#include <stdio.hに> 
する#include <CStringの>
 に#define lcoal
 の#define MAXN 100005
 使用して 名前空間STD;
 CHAR S [MAXN]、ミリアンペア[MAXN << 1。];
 INT MP [MAXN << 1。 ] ; // 注意ダブル開く

@の上で参照コードをoiwiki 
INT Manacher(チャーS [])
{ 
    int型のMal = 0 ;ミリアンペア[マル++] = ' ' ; // 最初の#に
    INT LEN = STRLEN(S)。
     以下のためのint型I = 0 ; 私は<lenは、++ I)
        MA [MAL ++] = S [i]は、MA [MAL ++] = ' ' 
    MP [ 0 ] = 0 ;
    以下のためにINT iが= 1、L = 0 - 、R = 1 ; I <MAL ++ I)
    { 
        MP [i]が R = I>か?1:分(MP [L + R - i]が、R - I)。
        一方( - MP [I]> = I 0 - && I + MP [I] <MAL && MA [I MP [I]] == MA [I + MP [I])
            MP [I] ++ ;
        もし(I + MP [I] == MAL)を返す - I 、[i]の融点を
        もし(I + MP [I]> R)
        { 
            L = I - MP [I]。
            R = I + MP [I]。
        } 
    } 
} 

int型のmain()
{ 
    int型、T。
    一方、(〜のscanf(" %S " 、S))
    { 
        のprintf(" %S " 、S)。
        T = Manacher(S)。
        INT I = T、I> 0 ; - I)
        { 
            場合(MA [I] =!' ' )のputchar(MA [I])。
        } 
        のputchar(' \ n ' ); 
    } 
}

おすすめ

転載: www.cnblogs.com/jionkitten/p/12231263.html