沾3080的光,这题让我WA了N多次!看到两个题一样,买一送二啊,上手就做,悲剧了。。
主要是没考虑一个字符时的情况,改来改去,最后终于想起来把KMP中的m初始化成-1就OK了。我这脑子是锈掉了么?忙活3个小时最后改了一个数就行了,纠结啊!
code:
#include<cstdio>
#include<cstring>
int next[201] ;
char substr[201] ;
char str[4001][201] ;
char result[201] ;
char temp[201] ;
int len[4001] ;
int n, max, sublen ;
void get_next(){
next[0] = -1 ;
int j = -1 ;
for(int i=1; i<sublen; i++){
while(j>-1&&substr[j+1]!=substr[i])
j = next[j] ;
if(substr[j+1]==substr[i]) j ++ ;
next[i] = j ;
}
}
void kmp(){
get_next() ;
int j, m ;
for(int k=1; k<n; k++){
j = -1, m = -1 ; //m必须为-1!!
for(int i=0; i<len[k]; i++){
while(j>-1&&substr[j+1]!=str[k][i])
j = next[j] ;
if(substr[j+1]==str[k][i]) j ++ ;
if(j>m) m = j ;
}
if(m<max) max = m ;//这里的max为下标,所以后面的ans在复制中要+1
}
}
int main(){
int i, j, ans ;
while(~scanf("%d", &n)&&n){
for(i=0; i<n; i++){
scanf("%s", str[i]) ;
len[i] = strlen(str[i]) ;
}
ans = -1 ;
for(i=0; i<len[0]; i++){
strcpy(substr, str[0]+i) ;
sublen = len[0] - i ;
max = 201 ;
kmp() ;
if(ans<max){
ans = max ;
strncpy(result, str[0]+i, ans+1) ;
result[ans+1] = '\0' ;
}else if(ans==max){
strncpy(temp, str[0]+i, ans+1) ;
temp[ans+1] = '\0' ;
if(strcmp(result, temp)>0)
strcpy(result, temp) ;
}
}
if(ans==-1)
printf("IDENTITY LOST\n") ;
else
printf("%s\n", result) ;
}
return 0 ;
#include<cstring>
int next[201] ;
char substr[201] ;
char str[4001][201] ;
char result[201] ;
char temp[201] ;
int len[4001] ;
int n, max, sublen ;
void get_next(){
next[0] = -1 ;
int j = -1 ;
for(int i=1; i<sublen; i++){
while(j>-1&&substr[j+1]!=substr[i])
j = next[j] ;
if(substr[j+1]==substr[i]) j ++ ;
next[i] = j ;
}
}
void kmp(){
get_next() ;
int j, m ;
for(int k=1; k<n; k++){
j = -1, m = -1 ; //m必须为-1!!
for(int i=0; i<len[k]; i++){
while(j>-1&&substr[j+1]!=str[k][i])
j = next[j] ;
if(substr[j+1]==str[k][i]) j ++ ;
if(j>m) m = j ;
}
if(m<max) max = m ;//这里的max为下标,所以后面的ans在复制中要+1
}
}
int main(){
int i, j, ans ;
while(~scanf("%d", &n)&&n){
for(i=0; i<n; i++){
scanf("%s", str[i]) ;
len[i] = strlen(str[i]) ;
}
ans = -1 ;
for(i=0; i<len[0]; i++){
strcpy(substr, str[0]+i) ;
sublen = len[0] - i ;
max = 201 ;
kmp() ;
if(ans<max){
ans = max ;
strncpy(result, str[0]+i, ans+1) ;
result[ans+1] = '\0' ;
}else if(ans==max){
strncpy(temp, str[0]+i, ans+1) ;
temp[ans+1] = '\0' ;
if(strcmp(result, temp)>0)
strcpy(result, temp) ;
}
}
if(ans==-1)
printf("IDENTITY LOST\n") ;
else
printf("%s\n", result) ;
}
return 0 ;
}