HDU2594 Simpsons’ Hidden Talents 【KMP】

在《辛普森一家》的世界中,Homer试图通过比较自己的名字与政治家的名字来发现自己的潜在才能。这篇文章通过编程解决了一个实际问题,即在一个字符串中找到最长的前缀作为后缀的匹配长度。文章详细介绍了输入输出规范、解决方案以及一些遇到的困惑,包括在使用next数组时的误操作和后续的调试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Simpsons’ Hidden Talents

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2798    Accepted Submission(s): 1055


Problem Description
Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had.
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.
 

Input
Input consists of two lines. The first line contains s1 and the second line contains s2. You may assume all letters are in lowercase.
 

Output
Output consists of a single line that contains the longest string that is a prefix of s1 and a suffix of s2, followed by the length of that prefix. If the longest such string is the empty string, then the output should be 0.
The lengths of s1 and s2 will be at most 50000.
 

Sample Input
clinton homer riemann marjorie
 

Sample Output
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");
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值