zoukankan      html  css  js  c++  java
  • 【HDU 2594 Simpsons' Hidden Talents】

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

    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

    Source

    HDU 2010-05 Programming Contest

    Recommend

    lcy

    题解:

          ①题目要求求出a串的最长前缀满足是b串的后缀

          ②两种解法,

                ZJ的方法是直接将a作为模板串匹配,最后指针j的值就是匹配长度也等于最长长度。

                Me的方法是将两个串拼起来转化为求最长公共前后缀(意义就是next[])

                不过呢不能超界(比如b偷走了a的后面部分充当自己的),加一些判断就好了。

                其实就是拼起来后进行一次next的预处理然后不断j=f[j]就可以了。

    #include<stdio.h>
    #include<cstring>
    #define go(i,a,b) for(int i=a;i<=b;i++)
    const int N=3000003;int m,n1,n2,j,f[N];char a[N],b[N],P[N];
    int main()
    {
    	while(m=0,~scanf("%s%s",a,b))
    	{
    		n1=strlen(a);go(i,0,n1-1)P[m++]=a[i];
    		n2=strlen(b);go(i,0,n2-1)P[m++]=b[i];f[1]=f[0]=0;
    		go(i,1,m-1){j=f[i];while(j&&P[i]!=P[j])j=f[j];f[i+1]=P[i]==P[j]?j+1:0;}
    		
    		j=m;while(j>n1||j>n2)j=f[j];
    		if(j){go(i,0,j-1)printf("%c",P[i]);putchar(' ');};printf("%d
    ",j);
    	}
    	return 0;
    }//Paul_Guderian
    

    可其它地方都没满,该满的地方都没满。————汪峰《满》

  • 相关阅读:
    ELF 格式简介
    gdb 使用说明;ARM 汇编
    博士研究生的组会PPT汇报相关-labgirls
    浅尝辄止·认识Blazor及基础使用
    VBA·Function的基础使用
    WCF·无法自动进入并单步执行服务器。调试器未能在服务器进程中停止。
    Word·查找任意汉字的方法
    VBA·编译错误:ByRef参数类型不符
    排坑·QQ浏览器打开MD文件时显示下载不能直接打开
    MSSQL·PIVOT关键字实现列转行
  • 原文地址:https://www.cnblogs.com/Damitu/p/7682515.html
Copyright © 2011-2022 走看看