トピックリンク:https://vjudge.net/contest/344930#problem/G
タイトル効果:あなたの文字列、彼は3パリンドロームは、少なくとも二つのより長さ以上に等しく、そしてこれらは、ネストされたパリンドロームをすることはできません含まれている場合(例えば、ネストされたAAA、AAAA、WAWネストさawawa)、もしストリング牛そう力が、それは彼の出力です。
トピックのアイデアは:この質問は実際にそれで貪欲な考えを持って、実際には、すべての時間は、私たちはうまく3と4弦の長さの回文の長さを見つける必要があります。ここでの戦略3のパリンドローム配列の長さを処理する第一工程、及び長さ4パリンドロームのその後の処理シーケンスです。それがサブストリング回避されるべきである場合、長さ4のパリンドローム配列を処理するパリンドローム配列です。
1の#include <stdio.hの> 2の#include <アルゴリズム> 3の#include <iostreamの> 4の#include <STDLIB.H> 5の#include < ストリング > 6の#include < 文字列・H> 7の#include <math.h>の 8の#include <ベクトル> 9の#include <キュー> 10の#include <積層> 11の#include <地図> 12の#include < セット > 13 14 15 の#define INF 0x3f3f3f3f 16 の#define LL長い長い 17 18符号なしのtypedef 長い 長い目。 19 CONST INT MAXN 1E5 + = 10 。 20 21 CHAR S [MAXN]。 22アウトベース = 131 。 23アウトMOD = 1E9 + 7 。 24 アウトP [MAXN]。 25 アウトさh1 [MAXN] H2 [MAXN]。 26 眼Q [MAXN]。 27 28 29眼get_hash(H目[]、INT S、INT R){ 30 リターン(H [R] - H [L- 1 ] * P [L + R- 1 〕)。 31 } 32 33 ブールチェック(CHAR S []){ 34 のstd :: セット <ULL> ST。 35 INT ANS = 0 。 36 INT LEN = STRLEN(S + 1 )。 37 のために(INT iが= 2、I + 1 <= LEN; I ++ ){ 38 であれば(S [I- 1 ] == S [I + 1 ]){ 39 ULL TEMP = get_hash(H1、I- 1、I + 1 ) ; 40 であれば(st.find(TEMP)==st.end()){ 41 st.insert(TEMP)。 42の ANS ++ ; 43 } 44 } 45 } 46 47 のために(INTは iは= 1 ; I + 3 <= LEN; I ++ ){ 48 であれば(S [I] == S [I + 3 ] && S [I + 1 ] == S [I + 2 ]){ 49 ULL A = get_hash(H1、I、I + 3 )。 50 = get_hash(H1、I + B ULL 1、I + 3 )。 51 ULL C = get_hash(H1、I、I + 2 )。 52 であれば(st.find()== st.end()&& st.find(B)== st.end()&& st.find(C)== st.end()){ 53の ANS ++ 。 54 st.insert(A)。 55 st.insert(B)。 56 st.insert(C); 57 } 58 } 59 } 60の リターン ANS> = 2 。 61 } 62 63 INT メイン(){ 64 P [ 0 ] = 1 ; 65 のために(INT iは= 1 ; I <MAXN I ++ ){ 66 P [I] = P [I- 1 ] * 基地; 67 } 68 ながら(〜のscanf(" %S "、S + 1 )){ 69 INT LEN = STRLEN(S + 1 )。 70 のために(INT iは= 1 ; iが<= LEN; I ++ ){ 71 H1 [I] = H 1 [I- 1 ] * 基地 + S [i]は、 72 } 73 もし(チェック(S)){ 74 のprintf(" %sの\ n "、S + 1 )。 75 } 76 } 77 リターン 0 。 78 }