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
  • 相关阅读:
    排序算法分析
    图论算法小结
    A*算法
    分支界限法的应用
    图的搜索策略
    最大二分匹配
    C++学习笔记(1)
    vscode简单c语言多文件编译
    c语言变量大小
    十大排序算法总结
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/hdu2594.html
Copyright © 2011-2022 走看看