码迷,mamicode.com
首页 > 其他好文 > 详细

小白进阶之路-HDU - 2594

时间:2020-05-30 01:32:37      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:lse   string   include   函数   最长匹配   大于   子串   str   main   

题意:给你两个字符串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\n");
        }else{
            s1[ans] = 0; // 添加终止符号,得到最长匹配长度的前缀。
            printf("%s %d\n",s1,ans);
        }
    }
    return 0;
}

 

小白进阶之路-HDU - 2594

标签:lse   string   include   函数   最长匹配   大于   子串   str   main   

原文地址:https://www.cnblogs.com/Wise-XiaoWei4/p/12990277.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!