元のタイトル: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 ' ); } }