После рассмотрения исходной строки , связанной за обратной исходной строки, отделены друг от друга промежуточным характером с характером , не в наборе, то можно найти самый длинный общий префикс для каждого символа , соответствующего строке символов , а второй половине передней половине строки , является ответом. При рассмотрении я-й строки символов палиндромным центр / правая ось симметрии символов ( что соответствует идти правую переднюю половину строки, строку , которая соответствует влево , чтобы вернуться назад) , палиндромная последовательность содержит нечетное число , соответственно , / четное число символов. Когда палиндромная последовательность содержит нечетное число символов, символы , соответствующие г-го символа является п-г + 1, длинный палиндромная последовательность LCP (я, п-г + 1) * 2-1, палиндромная последовательность представляет собой начальное положение я -lcp + 1 , когда палиндромная последовательность содержит четное количество символов, символы , соответствующие г-го символа является п-я + 2, палиндромная последовательность имеет длину LCP (я, п-2 + 1) * 2, палиндромной начало последовательности позиция I-LCP.
Следующей проблемой является быстрый спрос LCP (L, R), который может быть использован массив суффиксов и алгоритм разреженных таблицы
ZZ: HTTP: //blog.sina.com.cn/s/blog_4a0c4e5d01019j35.html
001 #include <cstdio> 002 #include <CString> 003 #include <Алгоритм> 004 с использованием пространства имен STD; 005 INT F [4005] [4005]; 006 ИНТ высота [4005]; 007 ИНТ ранг [4005]; 008 са INT [4005]; 009 - й символ [4005]; 010 ч INT [4005]; 011 Int N, р, ANS; 012 шаблон <Ьурепате Т> 013 недействительными Radix (Int А [], Int Ь [], Т ы [], Int N, Int м) 014 {INT I; 015 для (I = 0; я <= т; ++ я) 016 ч [I] = 0; 017 для (I = 1; я <= п; ++ я) 018 ++ H [с [а [я]]]; 019 для (I = 1; я <= т; ++ я) 020 ч [I] + = H [I-1]; 021 для (I = п;> 0; - я) 022 б [ч [с [а [я]]] -] = A [I]; 023} 024 недействительным init_sa () 025 {INT I, J; 026 Int А [4005], B [4005]; 027 для (I = 1; я <= п; ++ я) 028 ранга [I] = I; 029 Radix (ранг, са, ул, п, 256); 030 Оценка [са [1]] = 1; 031 для (I = 2; я <= п; ++ я) 032 , если (й [са [I-1]] = й [са [I]]!) 033 Оценка [са [я]] = ранг [са [I-1]] + 1; 034 еще ранг [са [я]] = ранг [са [I-1]]; 035 для (I = 1; я <= п; я * = 2) 036 {для (J 1, J <= N; j ++) 037 {а [J] = ранг [J]; 038 , если (I + J <= п) 039 б [J] = ранг [I + J]; 040 еще б [J] = 0; 041 са [J] = J; 042} 043 Radix (са, звание, б, п, п); 044 Radix (ранг, са, а, п, п); 045 Оценка [са [1]] = 1; 046 для (J = 2, J <= N; j ++) ! 047 если (а [са [J-1]] = а [са [J]] || Ь [са [J-1]] = б [са [J]]) 048 Оценка [са [J]] = ранг [са [J-1]] + 1; 049 еще ранга [са [J]] = ранг [са [J-1]]; 050 , если (ранг [са [п]] == п) 051 перерыва; 052} 053} 054 недействительными calc_h () 055 {INT I, р = 0; 056 для (I = 1; я <= п; ++ я) 057 {если (р> 0) 058 --p; (! Оценка [I] = 1) 059 , если 060 в то время как (й [я + р] == й [са [Оценка [I] -1] + р]) 061 ++ р; 062 Высота [Оценка [я]] = р; 063} 064} 065 недействительного init_rmq () 066 {Int I, J; 067 для (I = 1; я <= п; ++ я) 068 F [I] [0] = высота [I]; 069 для (J = 1; (1 << к) <= N; j ++) 070 для (I = 1; I + J-1 <= п; ++ я) 071 F [I] [J] = мин (F [I] [J-1], F [I + (1 << (J-1))] [J-1]); 072} 073 INT RMQ (интермедиат л, INT R) 074 {INT = 0; 075 , если (л> г) 076 подкачки (L, R); 077 в то время как ((1 << (к + 1)) <= г-л + 1) , 078 ++ к; 079 мин возврата (е [л] [к], F [R- (1 << к) + 1] [K]); 080} 081 INT LCP (интермедиат л, INT R) 082 {Int а, б; 083 а = ранг [л], Ь = ранг [г]; 084 , если (а> б) 085 подкачки (а, б); 086 возврата RMQ (а + 1, б); 087} 088 INT работа () 091 для (I = 1; я <= п / 2; 089 {INT I, K; 090 р = ANS = 1; 092 {к = LCP (я, п-г + 1); 093 , если (к * 2-1> ANS) 094 ANS = к * 2-1, р = я-к + 1; 095 к = LCP (я, п-я + 2); 096 , если (А * 2> ANS) 097 ANS = к * 2, р = ик; 098} 099 возврата ANS; 100} 101 INT основных () 102 {INT I, анс; 103 зсапЕ ( "% s", ст + 1); 104 п = StrLen (ST + 1); 105 - й [п + 1] = '#'; 106 для (я = п + 2; я <= п * 2 + 1; ++ я) 107 - й [г] = й [н- (в) +2]; 108 п = п * 2 + 1; 109 init_sa (); 110 calc_h (); 111 init_rmq (); 112 ANS = работа (); 113 для (я = р; я <р + ANS; ++ я) 114 Е ( "% С", ст [I]); 115 Е ( "\ п"); 1