http://poj.org/problem?id=3450

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 ;

posted on 2012-02-06 00:06  追逐.  阅读(375)  评论(0编辑  收藏  举报