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): 8010 Accepted Submission(s): 2837

    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
    【题目链接】:http://acm.hdu.edu.cn/showproblem.php?pid=2594

    【题解】

    很巧妙的题;
    把s1当成匹配串;
    s2当成被匹配串;
    在s2中匹配s1;
    然后做KMP;
    可知到了s1的最后一个字符的时候匹配到s2中的第几个字符;
    则这些字符的个数就是题目所需要的长度;
    (做KMP的时候,每次往移动都是最优的.匹配出来的肯定也是最长的了;)
    做KMP的时候始终保持匹配串的前缀即s1[1..j]是和s2[i-j+1..i]相同的;这里i是被匹配串扫描到的位置;
    如果i==length(s2)了;
    那么s2[i-j+1..i]就是s2的后缀了即s2[len2-j+1..len2]
    而在做KMP的时候会让j最大吧?

    【完整代码】

    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int MAXN = 5e4+10;
    
    string s1,s2;
    int l1,l2;
    int f[MAXN];
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        while (cin >> s1 >> s2)
        {
            l1 = s1.size(),l2 = s2.size();
            s1 = ' '+s1,s2 = ' '+s2;
            //s1 zicuan s2 zhucuan
            f[1] = f[2] = 1;
            for (int i = 2;i <= l1;i++)
            {
                int t = f[i];
                while (t>1 && s1[i]!=s1[t]) t = f[t];
                f[i+1] = s1[i]==s1[t]?t+1:1;
            }
            //kmp
            int j = 1;
            for (int i = 1;i <= l2;i++)
            {
                while (j>1 && s2[i]!=s1[j]) j = f[j];
                if (s2[i]==s1[j])
                    j++;
                if (j>l1)
                {
                    if (i==l2)
                        break;
                    j = f[j];
                }
            }
            if (j==1)
                puts("0");
            else
            {
                for (int i = 1;i <= j-1;i++)
                    putchar(s1[i]);
                putchar(' ');
                printf("%d
    ",j-1);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    Mvvm combobox绑定Dictionary问题
    类型转化方法(处理System.Nullable类型)
    linq 动态查询
    VS 2005 / 2008 / 2010 能否继续使用 ASP.NET 1.x版的DataGrid ????
    使用 Using...End Using区块来写程序,要非常小心!
    [习题]TreeView、Menu、SiteMapPath #2 多国语系 /当地语系 / Localization
    Repeater,不用自己写循环 (Loop)
    [习题]给初学者的范例,多重字段搜寻引擎 for GridView,兼论 SqlDataSource与SelectParameter的用法
    ASP.NET案例精编(清华大学出版社 / 作者MIS2000Lab)「勘误表」、补充习题与档案下载
    Windows Vista / 7减少不必要的服务、最佳化(优化)
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626712.html
Copyright © 2011-2022 走看看