//截取字符串 ch 的 st~en 这一段子串返回子串的首地址
//注意用完需要根据需要最后free()掉

char* substring(char* ch,int st,int en)
{
    ;
    char* pch=ch;
    );
    pch=pch+st;
    ;i<length;i++)   subch[i]=*(pch++);
    subch[length]='\0';
    return subch;
}

字符串截取

POJ 3080 Blue Jeans

题意 : 给出 n 个包含 60 个字符的字符串,问你这 n 个字符串的最长公共子串是什么,如果有多个,输出字典序最小的,如若没有则输出 “no significant commonalities”

分析 : 直接选择第一个串然后从长到短截取各个长度的子串去跟剩下的 n-1 个串进行匹配,如果得以匹配则比较这个长度下的其他未枚举的子串,选出字典序最小的继续匹配,持续更新答案,最后输出即可。

#include<string.h>
#include<stdio.h>
#include<string>
#include<malloc.h>
#include<stdlib.h>
using namespace std;
 + ;
][maxn], fir[maxn];
char * mo, * ans;
int num, Next[maxn], moL;
char* substring(char* ch,int st,int en)
{
    ;
    char* pch=ch;
    );
    pch=pch+st;
    ;i<length;i++)   subch[i]=*(pch++);
    subch[length]='\0';
    return subch;
}
inline void GetNext()
{
    , j = -;
    Next[i] = j;
    while(i < moL){
         && mo[i]!=mo[j]) j = Next[j];
        Next[++i] = ++j;
    }
}
bool KmpCount(int who)
{
    , j = ;
    ){
         && mo[j]!=str[who][i]) j = Next[j];
        i++, j++;
    }
    if(j == moL) return true;
    return false;
}
bool Is_Match(int st, int en)
{
    moL = en - st + ;
    mo = substring(fir, st, en);
    GetNext();
    ; k<num; k++){
        if(!KmpCount(k))
            return false;
    }return true;
}
inline void Find_better_ans(int pos, int len, int en)
{
    ; i<=en; i++){
        ,j=i; j<=i+len; j++,k++){
            if(ans[k] > fir[j]){
                if(Is_Match(i, i+len)){
                    ans = substring(mo, , moL-);
                }else { free(mo); break; }
            }else if(ans[k] < fir[j]) break;
        }
    }
}
bool Have_ans()
{
    ; len>=; len--){///枚举截取子串的长度,从大到小枚举
        ; i<=-len; i++){///在这个长度下,枚举所有子串的首字母
            if(Is_Match(i, i+len)){///判断是否匹配
                ans = substring(mo, , moL-);
                Find_better_ans(i, len, -len);
                return true;
            }else free(mo);
        }
    }return false;
}
int main(void)
{
    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
        scanf("%d", &num);
        scanf("%s", fir);
        ; i<num; i++) scanf("%s", str[i]);
        if(Have_ans()) { puts(ans); free(ans); }
        else puts("no significant commonalities");
    }
    ;
}

POJ 3450 Corporate Identity

题意 : 给出 n 个字符串,问你最长的公共子串,没有则输出 “IDENTITY LOST”

分析 : 这次直接选一个最短的,枚举其所有的子串去匹配剩下的 n-1 个串即可

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<algorithm>
;
char StrGroup[maxn][maxn], str[maxn], *mo, *ans;
int moL, Next[maxn], num, MinL, index, Len[maxn];
char* substring(int st,int en)
{
    ;
    );
    ,j=st;i<length;j++,i++)   subch[i]=StrGroup[index][j];
    subch[length]='\0';
    return subch;
}
inline void GetNext()
{
    , j = -;
    Next[i] = j;
    while(i < moL){
         && mo[i]!=mo[j]) j = Next[j];
        Next[++i] = ++j;
    }
}
bool RunKmp(int who)
{
    , j = ;
    while(j < moL && i < Len[who]){
         && mo[j]!=StrGroup[who][i]) j = Next[j];
        i++, j++;
    }
    if(j == moL) return true;
    return false;
}
bool RunMatch()
{
    GetNext();
    ; i<=num; i++){
        if(i!=index){
            if(!RunKmp(i)) return false;
        }
    }return true;
}

inline void Find_Better_Ans(int st, int len)
{
    ; i<=MinL-len; i++){
        ; k<len; j++,k++){
            //printf("ok %s\n", ans);
            if(ans[k] > StrGroup[index][j]){
                mo = substring(i, i+len-);
                moL = strlen(mo);
                if(RunMatch()){
                    free(ans);
                    ans = mo;
                    break;
                }else{ free(mo); break; }
            }else if(ans[k] < StrGroup[index][j]) break;
        }
    }
}

bool Match(int len)
{
    ; i<=MinL-len; i++){
        moL = len;
        mo = substring(i, i+len-);
        if(RunMatch()){
            ans = mo;
            Find_Better_Ans(i, len);
            return true;
        }else free(mo);
    }return false;
}
inline void PrintAns()
{
    ; len--)
        if(Match(len)){ puts(ans); free(ans); return; }
    puts("IDENTITY LOST");
}
int main(void)
{
    while(~scanf("%d", &num) && num){
        MinL = 0x3f3f3f3f;
        ; i<=num; i++){
            scanf("%s", StrGroup[i]);
            Len[i] = strlen(StrGroup[i]);
            if(MinL > Len[i]){
                MinL = Len[i];
                index = i;
            }
        }PrintAns();
    }
    ;
}

字符串截取模板 && POJ 3450、3080 ( 暴力枚举子串 && KMP匹配 )的更多相关文章

  1. hdu_2328_Corporate Identity(暴力枚举子串+KMP)

    题目链接:hdu_2328_Corporate Identity 题意: 给你n个串,让你找这n个串的最大公共子串 题解: 串比较小,暴力枚举第一个的子串,然后KMP判断是否可行 #include&l ...

  2. poj 3080 Blue Jeans (暴力枚举子串+kmp)

    Description The Genographic Project is a research partnership between IBM and The National Geographi ...

  3. POJ 2912 - Rochambeau - [暴力枚举+带权并查集]

    题目链接:http://poj.org/problem?id=2912 Time Limit: 5000MS Memory Limit: 65536K Description N children a ...

  4. POJ 3080 Blue Jeans (字符串处理暴力枚举)

    Blue Jeans  Time Limit: 1000MS        Memory Limit: 65536K Total Submissions: 21078        Accepted: ...

  5. 【poj 3080】Blue Jeans(字符串--KMP+暴力枚举+剪枝)

    题意:求n个串的字典序最小的最长公共子串. 解法:枚举第一个串的子串,与剩下的n-1个串KMP匹配,判断是否有这样的公共子串.从大长度开始枚举,找到了就break挺快的.而且KMP的作用就是匹配子串, ...

  6. POJ - 3294~Relevant Phrases of Annihilation SPOJ - PHRASES~Substrings POJ - 1226~POJ - 3450 ~ POJ - 3080 (后缀数组求解多个串的公共字串问题)

    多个字符串的相关问题 这类问题的一个常用做法是,先将所有的字符串连接起来, 然后求后缀数组 和 height 数组,再利用 height 数组进行求解. 这中间可能需要二分答案. POJ - 3294 ...

  7. Thinkphp 模板中直接对数据处理 模板中使用函数 中文字符串截取

    1.Thinkphp 模板中直接对数据处理:{$data.name|substr=0,3} 2.中文字符串截取函数:mb_substr=0,14,'utf-8' 3.中文字符串统计:iconv_str ...

  8. Codeforces Round #410 (Div. 2)(A,字符串,水坑,B,暴力枚举,C,思维题,D,区间贪心)

    A. Mike and palindrome time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

  9. POJ - 1426 暴力枚举+同余模定理 [kuangbin带你飞]专题一

    完全想不到啊,同余模定理没学过啊,想起上学期期末考试我问好多同学'≡'这个符号什么意思,都说不知道,你们不是上了离散可的吗?不过看了别人的解法我现在会了,同余模定理介绍及运用点这里点击打开链接 简单说 ...

随机推荐

  1. [ScreenOS] How to manually generate a new system self-signed certificate to replace the expired system self-signed certificate without resetting the firewall

    SUMMARY: This article provides information on how to manually generate a new system self-signed cert ...

  2. 【MM系列】SAP OX09中的地址如何取

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP OX09中的地址如何取   ...

  3. 应用安全 - 工具 - 知道创宇 - CEYE检测平台

    DNS Query

  4. 【Linux开发】Linux磁盘管理

    第八章 Linux磁盘管理 [查看磁盘或者目录的容量 df 和 du] df 查看已挂载磁盘的总容量.使用容量.剩余容量等,可以不加任何参数,默认是按k为单位显示的:df常用参数有 –i -h -k ...

  5. python 并发编程 多进程 队列目录

    python 并发编程 多进程 队列 python 并发编程 多进程 生产者消费者模型介绍 python 并发编程 多进程 生产者消费者模型总结 python 并发编程 多进程 JoinableQue ...

  6. Dubbo原理学习

    Dubbo源码及原理学习 阿里中间件团队博客 Dubbo官网 Dubbo源码解析 Dubbo源码解析-掘金 Dubbo源码解析-赵计刚 Dubbo系列 源码总结+最近感悟

  7. [19/05/27-星期一] JavaScript_ 条件语句(if语句)和循环语句(while 、for、do-while)

    一.条件语句 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...

  8. 数据库设计时,每个表要不要都设置自增主键ID!(转)

    逻辑数据库设计 - 需要ID(谈主键Id) 本文的目标就是要确认那些使用了主键,却混淆了主键的本质而造成的一种反模式. 一.确立主键规范 每个了解数据库设计的人都知道,主键对于一张表来说是一个很重要, ...

  9. 封装 多态 类的约束 super

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  10. ArcGIS Server导出shp文件

    需求: 在项目中客户提出需要在Web端能够定义条件将后台的数据导出shp文件,并下载. 实现: 基于ArcGIS开发导出矢量数据的服务,用户输入导出数据类型.过滤条件.导出范围等条件,服务能够快速将相 ...