Palinwords(パリンドローム配列処理)

トピックリンク: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 }

 

おすすめ

転載: www.cnblogs.com/-Ackerman/p/11955056.html