更好的方法:后缀数组 + 栈扫描
我的程序还可以在优化下:记录当前的长度,不去搜索比它小的子串
1
#include <cstdio>
2
#include <cstring>
3![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
4
const int STRNUM = 10 ;
5
const int SIZE = 62 ;
6![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
7
char str[STRNUM][SIZE] ;
8
int N ;
9![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
10
int next[STRNUM][SIZE] ;
11![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
12
bool FindSubstr( const int& k, const char* des )
13![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
14
int i = 0 , j = 0 , srcLen = strlen(str[k]) , desLen = strlen(des) ;
15![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
16
while ( i < srcLen && j < desLen )
17![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
18
if ( j == -1 || str[k][i] == des[j] )
19![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
20
i++ ;
21
j++ ;
22
}
23
else j = next[k][j] ;
24
}
25![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
26
if ( j >= desLen )
27
return true ;
28
else
29
return false ;
30
}
31![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
32
void GetNext()
33![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
34![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
35
for ( int i = 0 ; i < N ; ++i )
36![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
37
int j = 0 , k = -1 ;
38![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
39
next[i][0] = -1 ;
40![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
41
while ( j < (int)strlen(str[i]) )
42![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
43
if ( k == -1 || str[i][j] == str[i][k] )
44![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
45
j++ ;
46
k++ ;
47
next[i][j] = k ;
48
}
49
else
50
k = next[i][k] ;
51
}
52
}
53
}
54![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
55
void Solve()
56![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
57
int i , j , k ;
58![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
59
int len = (int)strlen(str[0]) ;
60
char temp[SIZE] ;
61![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
62
bool ok = false ;
63
char result[SIZE] ;
64
int rLen ;
65![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
66
GetNext() ;
67![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
68
for ( i = 0 ; i < len - 2 ; ++i )
69![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
70
for ( j = i , k = 0 ; j < len ; ++j , ++k )
71
temp[k] = str[0][j] ;
72![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
73
for ( j = k ; j > 2 ; --j )
74![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
75
temp[j] = '\0' ;
76![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
77
for ( k = 1 ; k < N ; ++k )
78![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
79
if ( !FindSubstr( k, temp ) )
80![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
81
break ;
82
}
83
}
84![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
85
if ( k == N )
86![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
87
if ( ok )
88![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
89
int tLen = (int)strlen(temp) ;
90
if ( tLen > rLen || (tLen == rLen && strcmp(temp, result) < 0) )
91![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
92
rLen = tLen ;
93
strcpy( result, temp ) ;
94
}
95
}
96
else
97![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
98
ok = true ;
99
strcpy( result, temp ) ;
100
rLen = (int)strlen(result) ;
101
}
102
}
103![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
104
}
105
}
106![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
107
if ( ok )
108![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
109
printf("%s\n", result) ;
110
}
111![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
else
{
112
printf("no significant commonalities\n") ;
113
}
114![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
115
}
116![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
117
void Input()
118![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
119
int i , n , m ;
120![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
121
scanf("%d", &n) ;
122![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
123
while ( n-- )
124![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
125
scanf("%d", &m) ;
126![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
127
N = m ;
128![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
129
getchar() ;
130![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
131
for ( i = 0 ; i < m ; ++i )
132![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
133
gets(str[i]) ;
134
}
135![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
136
Solve() ;
137
}
138![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
139
}
140![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
141
int main()
142![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
143
// freopen("1.txt", "r", stdin) ;
144![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
145
Input() ;
146![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
147
return 0 ;
148
}