POJ 1226 Подстроки

Описание

Вам предоставляются ряд чувствительных к регистру строк буквенных символов, найти большую строку X, такой, что либо X, либо обратный можно найти как подстроку любых из заданных строк.

вход

Первая строка входного файла содержит одно целое число T (1 <= т <= 10), число тестовых примеров, после чего входные данные для каждого теста. Первая строка каждого теста содержит одно целое число N (1 <нет = п <= 100), число заданных строк, а затем п строк, каждая из которых представляет одну строку минимальной длины 1 и максимальной длиной 100. Существует никаких дополнительных белое пространство до и после строки.

Выход

Там должна быть одна линия на тест случае, содержащий длину строки, найденной по величине.

Пример ввода

2 
3 
ABCD 
BCDFF 
BRCD 
2 
розы 
орхидеи

Пример вывода

- 
2 


идеи: Это название и poj2774 как, 2774 только две строки, и здесь есть п строк, эта проблема также может быть сильным KMP сделать это. Конечно, делать с этой проблемой лучше массива суффиксов, в связи с особым характером массива часов, и это проблема , которую мы можем поместить каждую строку вперед
и назад вместе, каждый из которых промежуточные строки расположены в различных специальных характер. Тогда позже найти са ч и массив массивов, мы перечисляем половину ответа, из ч [1], ч [2 ] продолжает перечислять его, чтобы увидеть , если больше середины, если не меньше , чем середины,
мы увидим , где они оригинальны ли исходное положение этой строки п, если п Chouqi строки, то в середине выполнимо.
1 #include <cstdio>
 2 #include <CMATH>
 3 #include <iostream>  
 4 #include <Алгоритм>  
 5 #include <CString>  
 6 с  использованием  пространства имен STD;  
7  INT  Const N = 20000 + 1000 ;  
8  INT N, T [N], Num [N], уа [N << 1 ], термометр [N << 1 ], WV [N], са [Н], гк [Н], ч [N];  
9  INT   s [N];   
10  символьные s1 [ 103 ];  
11  INT CMP ( INT * г, INT х,INT у, INT г) {
 12      возврата г [х] == г [г] && г [х + г] == г [у + г];  
13  }
 14  недействительного build_sa ( INT    * г, INT * са, Int п, INT м) {
 15      INT I, J, р, * х = в, * у = термометр;  
16      для (I = 0 ; г <т; я ++) Num [I] = 0 ; 
17      для (я = 0 ; <п; я ++) NUM [х [г] = г [г]] ++ ;  
18      для (I = 1 ; г <т; я ++) Num [I] + = Num [i - 1 ];  
19      для(я = п - 1 ; я> = 0 ; i--) са [- NUM [х [г]]] = I;    
20      для (р = 1 , J = 1 ; р <п, J << = 1 , т = р) {
 21          для (р = 0 , г = щ; <п; я ++) у [р ++] = I;  
22          для (I = 0 ; <п; я ++) если (SA [I]> = J) у [р ++] = са [I] - J;  
23          для (I = 0 ; г <т; я ++) Num [I] = 0 ;  
24          для (я = 0 ; <п; я ++) , WV [I] = х [у [I]];  
25          для (я = 0; <п; я ++) Num [WV [I]] ++ ; 
26          для (I = 1 ; г <т; я ++) Num [I] + = Num [i - 1 ];  
27          для (I = п- 1 , я> = 0 ; я--) - SA [NUM [WV [I]]] = у [I];  
28          подкачки (х, у);  
29          для (р = 1 , х [са [ 0 ]] = 0 , г = 1 ; <п; я ++ ) 
 30              х [са [я]] = CMP (у, са [i - 1 ], са [я ], к)? р 1 : р ++ ;  
31      }
 32      для (я = 0 ; <п; я ++) гк [I] =х [г];  
33  }
 34  недействительными build_h ( INT    * г, INT * са, INT п) {
 35      INT к = 0 ;  
36      для ( INT I = 0 ; <п; я ++ ) {
 37 ,          если (к) k-- ;  
38          INT J = са [гк [I] - 1 ];  
39 ,          а (г [я + K] == г [J + K]) K ++ ; 
40          ч [гк [я]] = K;  
41      }
 42  } 
 43  INT проверка ( INTсередина, INT м) {
 44      INT по отношению [ 101 ], Num = 0 ;  
45      MemSet (Vis, 0 , SizeOf (VIS));  
46      для ( INT I = 1 ; я <= т; я ++ ) {
 47 ,          если (ч [I]> = середина) {
 48 ,              если (! Vis [т [са [I]]]) {
 49                  Num ++; Vis [T [са [I]]] = 1 ;  
50              }
 51 ,              если (! Vis [т [са [i - 1 ]]]) {
 52                  Num ++; Vis [т [са [i- 1]]] = 1 ;  
53              }
 54 ,              если (число == п) возвращает  1 ;  
55          } еще {
 56              Num = 0 ;             
57              MemSet (Vis, 0 , SizeOf (VIS));  
58          }
 59      }
 60      возврата  0 ; 
61  }
 62  INT основной () {
 63      INT КАС;  
64      зсапЕ ( " % d " , & КАС); 
65 в      то время (cas-- ) {
 66          зсапЕ ( " % d " , & п);  
67          INT т = 0 , TOT = 130 ;  
68          для ( INT I = 0 ; <п; я ++ ) {
 69              Scanf ( " % S " , s1);  
70              INT LEN = StrLen (s1);  
71              для ( Int J = 0 , J <длина; j ++) с [M ++] = s1 [J], т [м- 1 ] = I + 1 ;  
72             с [M ++] = TOT ++ ;  
73              для ( Int J = len- 1 , J> = 0 ; j--) S [M ++] = s1 [J], т [м- 1 ] = I + 1 ; 
74              с [M ++] = TOT ++ ;  
75          }
 76          с [м] = 0 ;  
77          build_sa (с, са, т + 1 , 330 );   
78          build_h (с, са, м);  
79          INT л = 0 , г = 100 , ANS = 0 ;  
80 ,          а (л <= г) {
 81             Int середине = (L + R) / 2 ;  
82 ,              если (проверка (середина, м)) {
 83                  ANS = середина; л = середина + 1 ;  
84              } еще г = середина 1 ;  
85          }
 86          Е ( " % d \ п " , ANS); 
87      }
 88      возвращения  0 ;
89 }

 









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

отwww.cnblogs.com/ZJXXCN/p/10959111.html