美文网首页
计蒜客 - 首尾相接

计蒜客 - 首尾相接

作者: jxtxzzw | 来源:发表于2020-03-16 21:33 被阅读0次

计蒜客 - 首尾相接

蒜头君有两个字符串 S_1S_2,蒜头君想把 S_1 接到 S_2 后面。因为 S_1 前面有一些字符和 S_2 后面的一些字母一样,所以蒜头君在连接的时候就没必要重复了,比如 S_1cdefghS_2abcde,那么 cde 这部分就是最长的重复部分,蒜头君可以将这两个串连接为 abcdefgh。现在,给你串 S_1 和串 S_2,请你帮蒜头君找出最长重复部分的长度。

输入格式

共两行,每行一个字符串,由小写字母构成,第一行表示串 S_1,第二行表示串 S_2

(1\leq |S_1|,|S_2|\leq 50000)

riemann
marjorie

输出格式

答案输出在一行,先输出重复的字符串,再输出其长度,中间以空格隔开。若该串为空,只需输出 0

rie 3

这题用 KMP 或者拓展 KMP 都能做。

直接用 KMP 好了,简单点。

首先把 s1s2 依次拼接,然后对拼接成的字符串做一次 getNext(),该数组最后一个元素的值就是答案,因为它表示它所对应的字符之前有多少个,与该字符串开头的那么多个是一样的,这显然与题目要求的重复部分是相同的,因此直接输出 next[len3] 即可,对应的字符串就是开头的那么多个。

#include <bits/stdc++.h>

#define MAX_LEN 50007

// 以字符串 t 求 next 数组,n 为字符串长度
int* getNext(const char* t, int length) {
    int* next = (int*)malloc(sizeof(int) * (length + 1));
    next[1] = 0;
    for(int i = 2; i <= length; i++) {
        int j = next[i - 1];
        while(t[j + 1] != t[i] && j > 0) {
            j = next[j];
        }
        if(t[j + 1] == t[i]) {
            next[i] = j + 1;
        } else {
            next[i] = 0;
        }
    }
    return next;
}

// 拼接两个字符串
char* concat(const char* s1, const char* s2) {
    int len1 = strlen(s1);
    int len2 = strlen(s2);
    char* s3 = (char*)malloc(sizeof(char) * (len1 + len2 + 2));
    strncpy(s3 + 1, s1, len1);
    strncpy(s3 + 1 + len1, s2, len2);
    s3[1 + len1 + len2] = '\0';
    return s3;
}


void print(const char * t, const int* next, int n) {
    for (int i = 1; i <= n; i++) {
        printf("%c%c", t[i], i == n ? '\n' : '\t');
    }
    for (int i = 1; i <= n; i++) {
        printf("%d%c", next[i], i == n ? '\n' : '\t');
    }
}

int main() {
    char s1[MAX_LEN], s2[MAX_LEN];
    scanf("%s%s", s1, s2);
    char* s3 = concat(s1, s2);
    int len3 = strlen(s3 + 1);
    int* next3 = getNext(s3, len3);
//    print(s3, next3, len3);
    int ans = next3[len3];
    if (ans > 0) {
        for (int i = 0; i < ans; i++) {
            printf("%c", s1[i]);
        }
        printf(" ");
    }
    printf("%d", ans);
}

相关文章

  • 计蒜客 - 首尾相接

    计蒜客 - 首尾相接 蒜头君有两个字符串 和 ,蒜头君想把 接到 后面。因为 前面有一些字符和 后面的一...

  • 计蒜客(一)

    原题地址:判断元素是否存在 - 题库 - 计蒜客 蒜头君有一个集合 M 是这样生成的: (1) 已知 k 是集合 ...

  • 计蒜客题库五

    第五题 应该是没有问题,但第二组未通过

  • 计蒜客题库七

    第七题

  • 计蒜客题库六

    第六题

  • 计蒜客题库八

    第八题

  • 计蒜客 - 猴子打字

    计蒜客 - 猴子打字 有一个有趣的定理:无限猴子定理(infinite monkey theorem),它的表述如...

  • 计蒜客 - 矩阵查询

    计蒜客 矩阵查询 题目描述 给出 的矩阵 ,初始时均为 。 我们需要支持两种操作: ,表示 上的元素加上 。 ...

  • 计蒜客 - 斑点蛇

    计蒜客 - 斑点蛇 有一种神奇斑点蛇,蛇如其名,全身都是斑点,斑点数量可以任意改变。 有一天,蒜头君十分的无聊,开...

  • 计蒜客 - 黑白石头

    计蒜客 - 黑白石头 沙滩上有一些石头,石头的颜色是白色或者黑色。小羊会魔法,它能把连续一段的石头,黑色变成白色,...

网友评论

      本文标题:计蒜客 - 首尾相接

      本文链接:https://www.haomeiwen.com/subject/fnooehtx.html