HDU2594 Simpsons’ Hidden Talents 【KMP】
Simpsons’ Hidden Talents
Marge: Yeah, what is it?
Homer: Take me for example. I want to find out if I have a talent in politics, OK?
Marge: OK.
Homer: So I take some politician’s name, say Clinton, and try to find the length of the longest prefix
in Clinton’s name that is a suffix in my name. That’s how close I am to being a politician like Clinton
Marge: Why on earth choose the longest prefix that is a suffix???
Homer: Well, our talents are deeply hidden within ourselves, Marge.
Marge: So how close are you?
Homer: 0!
Marge: I’m not surprised.
Homer: But you know, you must have some real math talent hidden deep in you.
Marge: How come?
Homer: Riemann and Marjorie gives 3!!!
Marge: Who the heck is Riemann?
Homer: Never mind.
Write a program that, when given strings s1 and s2, finds the longest prefix of s1 that is a suffix of s2.
The lengths of s1 and s2 will be at most 50000.
clinton
homer
riemann
marjorie
0
rie 3
这题碰到了一些莫名其妙的问题,next数组本是记录模式串本身的匹配信息。我想着能不能用在两个不同的串上,然后就试验了一下,结果能想到的測试数据都能通过。可是就是WA。至今不知道错在哪里。
题意:给定两个串。求第二个串的后缀跟第一个串的前缀能匹配的最大长度并输出这个匹配串。
题解:在网上看到一种思路是将第一个串之后加入一个特殊字符,再把第二个串粘在第一个串后面,然后对这个新串求next数组。终于next[len]即为所求。
#include <stdio.h>
#include <string.h>
#define maxn 50002 char str1[maxn << 1], str2[maxn];
int ans, next[maxn << 1], len2; void getNext()
{
int i = 0, j = -1;
next[0] = -1;
while(str1[i]){
if(j == -1 || str1[i] == str1[j]){
++i; ++j;
next[i] = j;
}else j = next[j];
}
str1[ans = next[i]] = '\0';
} int main()
{
//freopen("stdin.txt", "r", stdin);
while(scanf("%s%s", str1, str2) == 2){
strcat(str1, " ");
strcat(str1, str2); getNext();
ans ? printf("%s %d\n", str1, ans) : printf("0\n");
}
}
放一个典型的错误代码。能想到的測试数据都通过了,可是提交就WA。不知道为什么。
#include <stdio.h>
#define maxn 50002 char str1[maxn], str2[maxn] = {' '};
int ans, next[maxn]; void getNext()
{
int i = 0, j = -1;
next[0] = -1;
while(str2[i]){
if(j == -1 || str2[i] == str1[j]){
++i; ++j;
next[i] = j;
}else j = next[j];
}
str1[ans = next[i]] = '\0';
} int main()
{
//freopen("stdin.txt", "r", stdin);
while(scanf("%s%s", str1, str2 + 1) == 2){
getNext();
ans ? printf("%s %d\n", str1, ans) : printf("0\n");
}
}
另外一个不知道错哪里的代码:
#include <stdio.h>
#define maxn 50002 char str1[maxn], str2[maxn] = {' ', ' '};
int ans, next[maxn]; void getNext()
{
int i = 0, j = -1;
next[0] = -1;
while(str2[i]){
if(j == -1 || str2[i] == str1[j]){
++i; ++j;
next[i] = j;
}else j = next[j];
}
str1[ans = next[i]] = '\0';
} int main()
{
//freopen("stdin.txt", "r", stdin);
while(scanf("%s%s", str1, str2 + 2) == 2){
getNext();
ans ? printf("%s %d\n", str1, ans) : printf("0\n");
}
}
HDU2594 Simpsons’ Hidden Talents 【KMP】的更多相关文章
- hdoj 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】
题目链接:http://acm.acmcoder.com/showproblem.php?pid=2594 题意:求最长的串 同一时候是s1的前缀又是s2的后缀.输出子串和长度. 思路:kmp 代码: ...
- hdu2594 Simpsons' Hidden Talents【next数组应用】
Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- HDU2594 Simpsons’ Hidden Talents —— KMP next数组
题目链接:https://vjudge.net/problem/HDU-2594 Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Oth ...
- hdu2594 Simpsons’ Hidden Talents kmp
Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU 2594 Simpsons’ Hidden Talents(KMP的Next数组应用)
Simpsons’ Hidden Talents Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- 【HDU 3746】Simpsons’ Hidden Talents(KMP求循环节)
求next数组,(一般有两种,求循环节用的见代码)求出循环节的长度. #include <cstdio> #define N 100005 int n,next[N]; char s[N] ...
- hdu2594 Simpsons’ Hidden Talents LCS--扩展KMP
Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had.Marge ...
- kuangbin专题十六 KMP&&扩展KMP HDU2594 Simpsons’ Hidden Talents
Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had. Marg ...
随机推荐
- 手机wap适配
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scal ...
- IIS 7 及以上 IIS错误页“编辑功能设置...”提示“锁定冲突”
原因是全局的设置锁定了此项,不让修改. 解决方法如下:
- 编程之美 1.1 让cpu占用率曲线听你指挥(多核处理器)
[目录] 不考虑其他进程,cpu画正弦曲线 获取总体cpu利用率 获取多核处理器单个cpu利用率 考虑其他进程,cpu画正弦曲线 下面的程序针对多核处理器,可以设置让任何一个cpu显示相应的曲线(本文 ...
- 微信小程序 - 步骤条组件
<!-- 未激活颜色: uncolor:'#ccc' 激活 active:0 数据源 data:[{},{}] 步骤条类型:type basic detail num more --> & ...
- Excel 2007 若干技巧。
1.自定义序列 office按钮→excel选项→常用→编辑自定义列表 2.无法清空剪贴板错误的处理办法: 取消"显示粘贴选项"选项 3.每次选定同一单元格 输入后按ctrl+En ...
- SpringBoot引入freemaker前端模板
1.引入freeMarker的依赖包 <!-- 引入freeMarker的依赖包. --> <dependency> <groupId>org.springfram ...
- node中__dirname、__filename、process.cwd()表示的路径
直接上结论:__dirname 表示当前文件所在的目录的绝对路径__filename 表示当前文件的绝对路径module.filename ==== __filename 等价process.cwd( ...
- ES6学习笔记四:Proxy与Reflect
一:Proxy 代理. ES6把代理模式做成了一个类,直接传入被代理对象.代理函数,即可创建一个代理对象,然后我们使用代理对象进行方法调用,即可调用被包装过的方法: 1)创建 var proxy = ...
- NDT(Normal Distributions Transform)算法原理与公式推导
正态分布变换(NDT)算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.下面的公式推导 ...
- DATEDIF函数
DATEDIF(start_date,end_date,unit) DATEDIF函数是Excel隐藏函数,在帮助和插入公式里面没有. 返回两个日期之间的年\月\日间隔数.常使用DATEDIF函数计算 ...