zoukankan      html  css  js  c++  java
  • hdu2594 Simpsons’ Hidden Talents

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2594

    思路:

    其实就是求相同的最长前缀与最长后缀

    KMP算法的简单应用;

    假设输入的两个字符串分别是s1,s2。s1后面再上一个任意的大写字母,然后再将串s2连在s1的后面,再在后面加上一个任意的大写字母(注意应该与前面所加的字母不同),那么对当前的s1串求其失败函数f,那么f[n-1]即为最大的匹配数,是不是很简单啊!!!至于中间和后面为什么加大些字母,留给读者自己思考咯

    代码:

     1 #include<cstring>
     2 #include<cstdlib>
     3 #include<cstdio>
     4 #include<iostream>
     5 using namespace std;
     6 const int maxn=50010;
     7 int n;
     8 int f[maxn*2];
     9 char s1[maxn*2];
    10 char s2[maxn*2];
    11 void callfail()
    12 {
    13     int j=0,k=-1;
    14     f[0]=-1;
    15     while(j<n)
    16     {
    17         if(k==-1||s1[j]==s1[k])   j++,k++,f[j]=k;
    18         else k=f[k];
    19     }
    20 }
    21 int main()
    22 {
    23         while(scanf("%s%s",s1,s2)!=EOF)
    24         {
    25             memset(f,0,sizeof(f));
    26             int len1=strlen(s1);
    27             s1[len1]='D';
    28             s1[len1+1]='';
    29             strcat(s1,s2);
    30             n=strlen(s1);
    31             s1[n]='A';
    32             n++;
    33             s1[n]='';
    34             callfail();
    35             int len=f[n-1];
    36             for(int i=0;i<len;i++)
    37             cout<<s1[i];
    38             if(len>0) cout<<" ";
    39             cout<<f[n-1]<<endl;
    40         }
    41         return 0;
    42 }
    View Code
  • 相关阅读:
    前端常用代码
    前端常用代码
    Velocity模版自定义标签
    算法思想
    java特性之三--多态性
    非线性数据结构--图
    接口
    java特性之四--抽象
    (数据结构与算法) 堆
    数据结构_平衡二叉树(AVL树)
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/hdu2594.html
Copyright © 2011-2022 走看看