HDU2594 Simpsons’ Hidden Talents 【KMP】

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

HDU2594 Simpsons’ Hidden Talents 【KMP】

时间: 2024-10-19 17:04:55

HDU2594 Simpsons’ Hidden Talents 【KMP】的相关文章

HDU2594 Simpsons’ Hidden Talents【KMP】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2594 题目大意: 给你两个串S1和S2,求既是S1的前缀同时是S2的后缀的最长字符串及长度. 思路: KMP算法中Next[j] == k的实质是当前字母不匹配时,模式串的前k项(S0~Sk-1)和位置j前 的k项(Sj-1-k~Sj-1)是相等的,这个k值是所有满足上面情况最大的.那么Next[len]的含义 就是模式串的最长的前缀和后缀相等的串长度. 利用Next[]的性质,先将串S2连接到S

hdu 2594 Simpsons’ Hidden Talents 【KMP】

题目链接:http://acm.acmcoder.com/showproblem.php?pid=2594 题意:求最长的串 同时是s1的前缀又是s2的后缀.输出子串和长度. 思路:kmp 代码: #include <vector> #include <string> #include <algorithm> #include <iostream> #include <stdio.h> #include <string.h> usin

hdu2594 Simpsons&#39; Hidden Talents【next数组应用】

Simpsons' Hidden Talents Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15015    Accepted Submission(s): 5151 Problem Description Homer: Marge, I just figured out a way to discover some of the

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 getnex

【HDU 3746】Simpsons’ Hidden Talents(KMP求循环节)

求next数组,(一般有两种,求循环节用的见代码)求出循环节的长度. #include <cstdio> #define N 100005 int n,next[N]; char s[N]; int main(){ scanf("%d",&n); while(n--){ scanf("%s",s); int i=0,k=-1; next[0]=k; while(s[i]){ if(k==-1||s[i]==s[k]) { i++; k++; ne

HDU2594 Simpsons’ Hidden Talents

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7361    Accepted Submission(s): 2622 Problem Description Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware w

HDU 2594 Simpsons’ Hidden Talents (KMP)

#include <stdio.h> #include <string.h> int next[50005]; char str1[50005],str2[50005]; void build_next(int len2) { int i=0,j=-1; next[0] = -1; while (i < len2) { if (j==-1 || str2[i] == str2[j]) { i++; j++; if (str2[i] != str2[j]) { next[i]

HDU 2594 Simpsons’ Hidden Talents (字符串-KMP)

Simpsons' Hidden Talents 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? M

HDU 2594 Simpsons’ Hidden Talents KMP题解

KMP的应用.直接使用s1产生next 数组,然后在s2中搜索s1,那么记录最后一个搜索到的数值,就是s1的前缀在s2中的最长后缀了. 本题应该不能直接调用strstr了吧. #include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <li