码迷,mamicode.com
首页 > 其他好文 > 详细

POJ-3450 Corporate Identity

时间:2014-11-04 19:39:40      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   os   for   sp   on   2014   

枚举一个串的所有子串,和其余的串匹配,裸kmp的题。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 222;
const int maxd = 4010;
int f[maxn];
char str[maxn];
char t_str[maxn];
char c_str[maxd][maxn];
void init_kmp(char *s){
    int L = strlen(s);
    f[0] = 0; f[1] = 0;
    for(int i = 1; i < L; i++){
        int j = f[i];
        while(j && s[i] != s[j]) j = f[j];
        f[i + 1] = s[i] == s[j] ? j + 1 : 0;
    }
}
int solve_kmp(char *s,int m){
    int L = strlen(s);
    int j = 0;
    for(int i = 0; i < L; i++){
        while(j && s[i] != t_str[j]) j = f[j];
        if(s[i] == t_str[j]) j++;
        if(j == m) return 1;
    }
    return 0;
}
int main(){
    int n;
    while(scanf("%d",&n) && n){
        scanf("%s",str);              //输入的第一个串,让它的子串作为模板进行匹配
        for(int i = 0; i < n - 1; i++) scanf("%s",c_str[i]);
        int L = strlen(str);
        int len_max = 0;                        //最终长度
        char ret_str[maxn];                     //最终字符串
        for(int i = L; i >= 1; i--){            //枚举子串的时候按照长度从小到大进行枚举
            for(int j = 0; j + i <= L; j ++){
                strncpy(t_str,str + j,i);       //枚举一个子串
                t_str[i + j] = '\0';
                //printf("%d,%d:%s\n",i,strlen(t_str),t_str);
                init_kmp(t_str);                //构造状态转移函数
                int ok = 1;
                for(int k = 0; k < n - 1; k ++) //与每个字符串进行匹配
                    if(!solve_kmp(c_str[k],i)){ //如果没办法匹配
                        ok = 0;
                        break;
                    }
                //if(ok) puts(t_str);
                if(ok && i > len_max){
                     len_max = i;
                     strcpy(ret_str,t_str);
                     //puts(t_str);
                }
                if(ok && i == len_max && strcmp(ret_str,t_str) > 0){
                    //puts(t_str);
                    strcpy(ret_str,t_str);
                }
            }
            if(i < len_max + 1) break;
        }
        if(!len_max) printf("IDENTITY LOST\n");
        else printf("%s\n",ret_str);
    }
    return 0;
}

POJ-3450 Corporate Identity

标签:style   blog   io   ar   os   for   sp   on   2014   

原文地址:http://blog.csdn.net/u013451221/article/details/40790423

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!