コード
1 // 最小回文ストリング、無視句読点およびスペース 2の#include <stdio.hの> 3の#include < 文字列・H> 4の#include <のctype.h> 5 の#define MAXN 5000 + 10 。6 。7 チャーBUF [MAXN] 、S [MAXN]; 8 INT P [MAXN]; 9 int型のmain() 10 { 11 INT N-、M = 0 、 12である 関数fgets(BUF、はsizeof (S)、標準入力); 13である N- = STRLEN(BUF) 14 以下のための(int型 I = 0 ; I <N-; I ++ ) 15 { 16 IF (はisalpha(BUF [I])) 17。 { 18は P [M] = I; 19 S [M ++] = TOUPPER(BUF [I]); 20 } 21れる } 22である のprintf(" %S \ N- " 、S)、 23は 24 のint =最大0、X = 0、Y = 0 ; 25 26である 27 // なしの最適化 28 / * (I = 0のため、I <M、I ++)//このアプローチは三重を必要別の方法あればサイクルは、次の参照 29 { 30の 31 IS 用(INT J = I; J <Mであり、j ++) 32 { 33 のint OK = 1、K。 34 (; K <=(JI)/ 2 K ++、K = 0)のための 35 { 36 IF(!S [I + K] = S [JK]) 37 { 38 OK = 0。 39 ブレーク; 40 } 41 } 42 であれば(OK && J-I + 1> max)の 43 { 44 、最大= J-I + 1。 45 X = P [i]は、 46 、Y = P [J]。 47 } 48 } 49 } * / 50 51である // 最適化方法 52である ため(私は= 0 ; I <M、I ++) // iは中心にあるこのだけ拡張検出器2環状方法両側に、しかし2点パリティサイクル 53は、 { 54れる INT ; K 55 用(K = 0 ; IK> = 0 && I + K <M、K ++)// パリンドローム配列が奇数であり、S [i]の中間体パリンドローム配列のための 56 { 57 IF(!S [IK] = S [K + I])BREAK ; // IF(!S [IK] = S [K + I]) 58 // { 59 IF(2 * K + 1。> MAX) // もし(2 *(K-1)+1> max)の 60 { // { 61 、最大= 2 * K + 1。 // 最大= 2 *(K-1)+1。 62 X = P [IK]。 // X = P [1-(K-1)]。 63 、Y = P [I + K]。 // Y = P [I +(K-1)]。 64 } // } 65 // ブレーク。 66 //}このようなループが最初IKについて決定されるので、最大パリンドローム配列は、最初または最後に表示されるブロックに書き込まれた文章、<0又はK + I> M、場合 67 } // 直接終了の原因循環ループは、入力することはできませんIF(2 *(K-1 )+1> max)のステートメントブロック、そうマックス、X、Yの更新が失敗したことを、誤差 68 69 のために(K = 0 ; IK> = 0 && I + K + 1 <M、K ++)/ / パリンドローム配列が偶数であり、S [i]は中央左パリンドローム配列のための 70 { 71で IF(S [IK] S = [I + K +!1。 ])BREAK ; // IF(S [IK]! S = [I + K + 1]) 72 // { 73は IF(2 * K + 2 > MAX) // IF(2 *(K-1)+2>最大) 74 { // { 75 、最大= 2 * K + 2 ; // 最大= 2 *(K-1)+2; 76 X = P [IK]; / / X = P [I-(1-K)]; 77 、Y = P [I + K + 1 ]; // Y = P [I +(1-K)+ +1]; 78 } // } 79 // BREAK ; 80 // 同じ理由}間違っています。 81 } 82 } 83 84 85 86 のprintf(" 最も長いパリンドロームストリング(文字長のみ):%D \ N- " 、MAX); 87 用(; I <= Y; I = X I ++ )のputchar(BUF [I ]); 88 のputchar(' \ N- ' ); 89 リターン 0 ; 90 }