HDU 2594 Simpsons’ Hidden Talents (KMP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594
这题直接用KMP算法就能够做出来,只是我还尝试了用扩展的kmp,这题用扩展的KMP效率没那么高。
KMP算法:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int next[50001];
char p[50000],s[50000];
void getnext()
{
int plen=strlen(p),k=0,j=1;
next[0]=-1;next[1]=0;
while (j<plen)
{
if (k==-1||p[j]==p[k])
{
k++;j++;
next[j]=k;
}
else k=next[k];
}
}
int kmp()
{
int i=0,j=0,slen=strlen(s),plen=strlen(p);
while (i<slen)
{
if (j == -1 || s[i] == p[j])
{
i++;
j++;
}
else j=next[j];
}
if (j==-1) j=0;
return j;
}
int main()
{
int i;
while (scanf("%s%s",p,s)!=EOF)
{
getnext();
i=kmp();
if (i)
{
for (int j=0;j<i;j++)
printf("%c",p[j]);
printf(" %d\n",i);
}
else printf("0\n");
}
return 0;
}
扩展的KMP:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
char S[50000],T[50000];
int A[50001],B[50001],sl,tl;
void getA()
{
int j=0;
while(1+j<tl&&T[0+j]==T[1+j]) j++;
A[1]=j;
int k=1;
for(int i=2;i<tl;i++)
{
int len=k+A[k]-1,l=A[i-k];
if(l<len-i+1) A[i]=l;
else
{
j=max(0,len-i+1);
while(i+j<tl&&T[i+j]==T[0+j])
j=j+1;
A[i]=j;k=i;
}
}
}
void getB()
{
getA();
int j=0;
while(j<sl&&j<tl&&T[0+j]==S[0+j])
j++;B[0]=j;
int k=0;
for(int i=1;i<sl;i++)
{
int len=k+B[k]-1,l=A[i-k];
if(l<len-i+1) B[i]=l;
else
{
j=max(0,len-i+1);
while(i+j<sl&&j<tl&&S[i+j]==T[0+j])
j=j+1;
B[i]=j,k=i;
}
}
}
int main()
{
int i;
while (~scanf ("%s %s",T,S))
{
int num=0;
sl=strlen(S),tl=strlen(T);
getB();
for (i=0;i<sl;i++)
if (B[i]==sl-i)
{
num=B[i];
break;
}
if (num>0)
{
for (int j=0;j<num;j++)
printf("%c",T[j]);
printf(" ");
}
printf("%d\n",num);
}
return 0;
}
HDU 2594 Simpsons’ Hidden Talents (KMP)的更多相关文章
- HDU 2594 Simpsons’ Hidden Talents(KMP的Next数组应用)
Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- HDU 2594 Simpsons’ Hidden Talents(辛普森一家的潜在天赋)
HDU 2594 Simpsons’ Hidden Talents(辛普森一家的潜在天赋) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 3 ...
- hdu 2594 Simpsons’ Hidden Talents(两个串的next数组)
题意:两个字符串s.t,求s和t的最长的相同的前缀和后缀 思路:先求s的next数组,再求t的next数组(即代码中ex数组,此时不是自己与自己匹配,而是与s匹配),最后看ex[len2]即可(len ...
- hdu 2594 Simpsons’ Hidden Talents 【KMP】
题目链接:http://acm.acmcoder.com/showproblem.php?pid=2594 题意:求最长的串 同一时候是s1的前缀又是s2的后缀.输出子串和长度. 思路:kmp 代码: ...
- hdu 2594 Simpsons’ Hidden Talents(扩展kmp)
Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren’ ...
- hdu 2594 Simpsons’ Hidden Talents KMP
Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- hdu 2594 Simpsons’ Hidden Talents KMP应用
Simpsons’ Hidden Talents Problem Description Write a program that, when given strings s1 and s2, fin ...
- hdu 2594 Simpsons’ Hidden Talents(KMP入门)
Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- hdoj 2594 Simpsons’ Hidden Talents 【KMP】【求串的最长公共前缀后缀】
Simpsons' Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
随机推荐
- django:DateTimeField如何自动设置为当前时间并且能被修改 ——django日期时间字段的使用
创建django的model时,有DateTimeField.DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime().date().time()三中对象 ...
- 对JAVASCRIPT匿名函数的理解
网上很多解释,我无法理解,我想知道原理...这篇文章应该可以透彻一点 Query片段: (function(){ //这里忽略jQuery所有实现 })(); 要说匿名函数,我们首先要由函数本身说起. ...
- Along with all the above benefits, you cannot overlook the space efficiency and performance gains in using DataFrames and Dataset APIs for two reasons.
Of all the developers’ delight, a set of APIs that makes them productive, that are easy to use, and ...
- Python以不可见字符作为列分割符
# -*- coding: utf-8 -*- import sys import time CTRL_A='\x01' CTRL_B='\x02' thedate = '' thetime = '' ...
- AES加解密JS和php互相处理字符
Reference: http://blog.csdn.net/carlos__z/article/details/53185082 JavaScript code? 1 2 3 4 5 6 7 8 ...
- .Net应该学什么怎么学(一)
更新时间:2012年06月05日18时21分 来源:传智播客.Net 上篇<学了.Net做什么开发>中我讲到了目前.Net开发主要方向是Web开发,因此在本篇中我将主要讲解做Web开发要学 ...
- Redis学习之(二)java运用
都1.首先,如果要在java运用的话,就需要引入对应的jar包 https://pan.baidu.com/s/1Hu1mUX5XoE_HmUEFlU3XBg 2.还有一点注意的就是,我在使用JDK8 ...
- java虚拟机和Dalvik虚拟机
java虚拟机和Dalvik虚拟机的区别: java虚拟机Dalvik虚拟机 java虚拟机基于栈. 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多dalvik虚拟机是基于寄存器的 j ...
- ATM交换机 和普通交换机区别
运行在 ATM协议上的交换机 普通的是运行在 以太网协议上的 ATM交换机 转发的是广域网二层协议数据包,以太网交换机转发的是局域网二层协议数据包. 网络的ATM是指:异步传输模式,全称是什么 Asy ...
- spring配置事务 元素 "tx:annotation-driven" 的前缀 "tx" 未绑定
在进行spring与mybatis整合时,启动项目报错,控制台提示“元素 "tx:annotation-driven" 的前缀 "tx" 未绑定”. 经过查找, ...