• poj 3450 Corporate Identity (KMP)


    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 ;

  • 相关阅读:
    C# 利用Autofac批量接口注入依赖【学习记录】
    c# Quartzs定时器的简单使用
    Web Api 宿主的搭建
    教你如何搭建自己的直播服务器简易
    自用电脑+外网开放+SSL认证(纯免费)
    sql 获取主键表和主键的方法
    sql 分裂字符串函数
    Sql 将一个整型数字转换成带前导零的固定长度数字字符串
    sql 根据外键表和外键列得到主键表和主键列的方法
    定位div
  • 原文地址:https://www.cnblogs.com/xiaolongchase/p/2339424.html
Copyright © 2020-2023  润新知