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
    

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

  • 相关阅读:
    利用mybatis-generator自动生成代码
    gradle安装
    有关﹤![CDATA[ ]]> 说明
    mysql时间字段转换为毫秒格式
    string 与BigDecimal互转
    VLOOKUP多条件查找不使用辅助列
    BIEE-CSS样式大全
    VBA【遍历每个工作表并将工作表表名赋予B2单元格】
    深入理解公式{1,0}的用法
    DB2解锁
  • 原文地址:https://www.cnblogs.com/Damitu/p/7682515.html
Copyright © 2011-2022 走看看