zoukankan      html  css  js  c++  java
  • 小白进阶之路-HDU

    题意:给你两个字符串s1,s2,让你寻找最长s1前缀和s2后缀的匹配长度,若长度大于0,且输出最长匹配s1前缀。

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    const int maxn = 1e5 + 100;
    int nxt[maxn];
    
    /*
     * 题目思路:把s2拼接在s1后,问题变成了拼接后字符串s的最后前缀后缀匹配长度,但因为有可能
                长度超过s1,s2的长度,所以限制一下条件。求最长前缀和后缀的匹配长度也就是KMP
                中求NEXT数组的方法。
     */
     
    /*
     * 感想:初学KMP,对于一些概念的理解还不是很深入,这题我思考了很久,用前后缀比对,MLE,
     * 用子串函数,TLE。。。细细想来就明白了。还要多加训练。
     */
    
    void GetNextArray(char *s)
    {
        int len = strlen(s);
        nxt[0] = -1;nxt[1] = 0;
        int i = 1,cn = 0;
        while(i < len){
            if(s[i] == s[cn]){
                nxt[++i] = ++cn;
            }else if(cn > 0){
                cn = nxt[cn];
            }else{
                nxt[++i] = 0;
            }
        }
    }
    
    int main()
    {
        char s1[maxn],s2[maxn];
        while(~scanf("%s%s",s1,s2)){
            int len1 = strlen(s1);
            int len2 = strlen(s2);
            strcat(s1,s2);
            GetNextArray(s1);
            int ans = nxt[strlen(s1)];
            while(ans > len1 || ans > len2){
                ans = nxt[ans];
            }
            if(ans <= 0){
                printf("0
    ");
            }else{
                s1[ans] = 0; // 添加终止符号,得到最长匹配长度的前缀。
                printf("%s %d
    ",s1,ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    Linux的命令技巧
    MAC地址表、ARP缓存表以及路由表
    边缘触发(Edge Trigger)和条件触发(Level Trigger)
    vue-router跳转页面
    正则表达式(简单易懂篇)
    Markdown快速使用指南
    WEB前端资源集(二)
    WEB前端资源集(一)
    js判断移动端与pc端
    js原声快速实现选项卡
  • 原文地址:https://www.cnblogs.com/Wise-XiaoWei4/p/12990277.html
Copyright © 2011-2022 走看看