Ural1297 длинная строка палиндромом

После рассмотрения исходной строки , связанной за обратной исходной строки, отделены друг от друга промежуточным характером с характером , не в наборе, то можно найти самый длинный общий префикс для каждого символа , соответствующего строке символов , а второй половине передней половине строки , является ответом. При рассмотрении я-й строки символов палиндромным центр / правая ось симметрии символов ( что соответствует идти правую переднюю половину строки, строку , которая соответствует влево , чтобы вернуться назад) , палиндромная последовательность содержит нечетное число , соответственно , / четное число символов. Когда палиндромная последовательность содержит нечетное число символов, символы , соответствующие г-го символа является п-г + 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

  

рекомендация

отwww.cnblogs.com/cutemush/p/12343508.html
рекомендация