算法题:HDU 2594 Simpsons’ Hidden Talents(KMP)

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2594

题目大意:

给两个字符串s1和s2, 求出是s1的前缀并且是s2的后缀的最长的字符串。

分析与总结:

真正理解好KMP算法,这题就是水题。

首先求出s1的失配函数,然后在s2中 寻找s1字符串。

在寻找字符串过程中,会有一个状态值j,这个值表示的是当前在s2中已经匹配 了多少个s1的字符。 所以,全部匹配完后,最后j的值就是以s2的最后一个字符结尾,和s1的前缀相匹 配的最长字符串。也就是所求的答案了。

还有一种方法:

网上有不少题解貌似都是把s1 和s2拼接起来成s3,然后求s3自身的next,原理其实是一样的。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;  

const int MAXN = 50005;
char s1[MAXN];
char s2[MAXN];
int  f[MAXN];  

void getFail(char *p, int *f){
    int n=strlen(p);
    f[0]=f[1]=0;
    for(int i=1; i<n; ++i){
        int j=f[i];
        while(j && p[i]!=p[j]) j=f[j];
        f[i+1] = p[i]==p[j]?1+j:0;
    }
}
int find(char *T,char *p,int *f){
    getFail(p,f);
    int n=strlen(T);
    int m=strlen(p);
    int j=0;
    for(int i=0; i<n; ++i){
        while(j && T[i]!=p[j]) j=f[j];
        if(T[i]==p[j])++j;
    }
    return j;
}  

int main(){
    while(scanf("%s %s",s1,s2)!=EOF){
        int x=find(s2,s1,f);
        if(!x) puts("0");
        else{
            int len=strlen(s2);
            printf("%s %d\n",s2+len-x,x);
        }
    }
    return 0;
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索算法
, 字符串
, int
, include
, 字符
, 前缀
, 算法 ccf acm
, acm算法数据结构
, 算法题
javascript算法题
the simpsons、simpsons、the simpsons潮牌官网、the simpsons 28、the simpsons官网,以便于您获取更多的相关知识。

时间: 2024-10-30 14:06:52

算法题:HDU 2594 Simpsons’ Hidden Talents(KMP)的相关文章

hdu 2594 Simpsons’ Hidden Talents

点击打开链接hdu 2594 思路:kmp+next数组的应用 分析: 1 题目要求的是给定两个字符串s1 , s2找到s1的最长前缀等于s2的后缀 2 很明显就是next数组的应用,我们知道next[j] = len,表示的前j个字符里面前缀和后缀的最长匹配长度为len.那么我们只要合并两个字符串然后求next数组即可. 3 注意以下的数据 abcabcabcabc abcabcabcabcabc 输出 12 abcabc abc 输出 3 我们知道如果合并了s1和s2的话,那么求出来的最长的

算法题:poj 2541 Binary Witch(KMP水过,逆序转换)

链接: http://poj.org/problem?id=2541 分析与总结: 做这题估算了下复杂度,觉得无论KMP再怎么快,这题暴力也肯定要超时的. 想了很久也没想出个好办法,于是决定暴力之,但是TLE了....于是就放了几天.之后看了下discuss ,这题的正解应该是状态压缩dp,不过目前我还不懂,跪了. 之后百度发现也可以用KMP水过,虽然是因为数据水才过的,不过这种思路很巧妙,值得借鉴! 直接暴力是枚举字符串的后面13个的字母,然后再用KMP匹配,这样的话,就绪要枚举多次,分别是

经典算法题每日演练——第七题 KMP算法

原文:经典算法题每日演练--第七题 KMP算法       在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树是变态级的,那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输 入法总是提示"看毛片"三个字,嘿嘿,就叫"看毛片算法"吧. 一:BF算法      如果让你写字符串的模式匹配,你可能会很快的写出朴素的bf算法,至少问题是解决了,我想大家很清楚的知

算法:hdu 4558 剑侠情缘(dp, 西山居复赛1第2题)

思路: 这是刚练dp后做比赛遇到的第一道dp题 比赛时想了一个状态转移方程,f[i][j] [k][l][2], i和j表示在第i行j列, k和l表示人和剑的能量,最后一维0表示当前这个能量给人补充,1表示 给剑补充转移为: f[i][j][k][l][0] = f[i-1][j][k-mat[i][j]][l][1]+f[i][j-1][k-mat [i][j]][l][1];f[i][j][k][l][1] = f[i-1][j][k][l-mat[i][j]][0]+f[i][j-1][k

算法题:uva 1330

题目链接: http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=460&page=show_problem&problem=4076 以前做过一道一维的,这题只是变成了二维的,其他方法都一样.HDU 1506  Largest Rectangle in a Histogram   题解 代码1: #include<cstdio> #include<cs

经典算法题每日演练——第八题 AC自动机

原文:经典算法题每日演练--第八题 AC自动机        上一篇我们说了单模式匹配算法KMP,现在我们有需求了,我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题. 当然你也可以用KMP算法求出,那么它的时间复杂度为O(c*(m+n)),c:为模式串的个数.m:为模式串的长度,n:为正文的长度,那 么这个复杂度就不再是线性了,我们学算法就是希望能把要解决的问题优化到极致,这不,AC自动机就派上用场了.    其实AC自动机就是Trie树的一个活用,活用点就是灌输了kmp的思想,从

一个算法题,求答案啊啊啊啊

问题描述 一个算法题,求答案啊啊啊啊 白班 09:00-18:00 通班 09:00-21:00 每个人每个月通班数量必须等于早中班和中晚班数量之和 早中班 09:00-15:00 中晚班 15:00-21:00 假设:每月按照30计算. 排班规则: 1.每个人每个月固定休息6天连续上班天数不超过7天. 2.每天各班次上班的人数最低需求:8个白班5个通班1个早中班,2个中晚班. 3.每个月每个人的通班天数安排不超过8天. 4.每个人每个月早中班和中晚班的天数之和需要与通班天数相等. 5.每月最多

算法题:把阿拉伯金额转化为汉字表示的金额

n年没写算法题了,今天用了20分钟写了一个,要求如题,感觉算法有所退步,老了 using System; using System.Text; namespace money { class Program { static void Main(string[] args) { StringBuilder sb=new StringBuilder(); var strValue = Console.ReadLine(); var strlist = strValue.Split('.'); if

算法题:uva 10318

题目链接: 首先,可以确定每个格子只能选一次,因为选任何大于0的偶数次,等于没有效果 一样. 然后,就可以把这题理解成从r*c的矩阵中选择一些格子进行"点亮"操作,使得最终所 有格子都是"亮"的状态.那么,每个格子要么有点亮操作,要么没有,总共复杂度为2^25,显然必须 进行减枝. 假设从第一行第一列开始,从左往右,从上往下一次依次选择,对于当前所在位置( x, y),它已经不能影响到x-2以前的行数了,所以当到x行时,如果第x-2行没有全部点亮,则进行减枝 . 此