首页 > 其他分享 >哈希的刷题奇遇记2

哈希的刷题奇遇记2

时间:2024-12-02 22:04:22浏览次数:11  
标签:cnt string int 哈希 字符串 mod 刷题 奇遇记

[USACO09OCT] Barn Echoes G

题目入口

题目描述

The cows enjoy mooing at the barn because their moos echo back, although sometimes not completely. Bessie, ever the excellent

secretary, has been recording the exact wording of the moo as it goes out and returns. She is curious as to just how much overlap there is.

Given two lines of input (letters from the set a…z, total length in the range 1…80), each of which has the wording of a moo on it, determine the greatest number of characters of overlap between one string and the other. A string is an overlap between two other strings if it is a prefix of one string and a suffix of the other string.

By way of example, consider two moos:

moyooyoxyzooo
yzoooqyasdfljkamo

The last part of the first string overlaps ‘yzooo’ with the first part of the second string. The last part of the second string

overlaps ‘mo’ with the first part of the first string. The largest overlap is ‘yzooo’ whose length is 5.

POINTS: 50

奶牛们非常享受在牛栏中哞叫,因为她们可以听到她们哞声的回音。虽然有时候并不能完全听到完整的回音。Bessie 曾经是一个出色的秘书,所以她精确地纪录了所有的哞叫声及其回声。她很好奇到底两个声音的重复部份有多长。

输入两个字符串(长度为 1 1 1 到 80 80 80 个字母),表示两个哞叫声。你要确定最长的重复部份的长度。两个字符串的重复部份指的是同时是一个字符串的前缀和另一个字符串的后缀的字符串。

我们通过一个例子来理解题目。考虑下面的两个哞声:

moyooyoxyzooo
yzoooqyasdfljkamo

第一个串的最后的部份 yzooo 跟第二个串的第一部份重复。第二个串的最后的部份 mo 跟第一个串的第一部份重复。所以 yzooomo 都是这 2 2 2 个串的重复部份。其中,yzooo 比较长,所以最长的重复部份的长度就是 5 5 5。

输入格式

* Lines 1…2: Each line has the text of a moo or its echo

输出格式

* Line 1: A single line with a single integer that is the length of the longest overlap between the front of one string and end of the other.

样例 #1

样例输入 #1

abcxxxxabcxabcd 
abcdxabcxxxxabcx

样例输出 #1

11

提示

‘abcxxxxabcx’ is a prefix of the first string and a suffix of the second string.

题解

之间区间hash一下 前面的 和 后面的 就行

Code

#include <bits/stdc++.h>
#define int long long 
using namespace std;

// 存储输入的两个字符串
string a, b;

// 读取输入的两个字符串函数
void read()
{
    cin >> a >> b;  // 从标准输入读取两个字符串
}

// 用于存储字符串 a 和 b 每个位置的哈希值
int cnt_a[110], cnt_b[110];
// 哈希计算中的基数
int p = 40;
// 取模的值
const int mod = 1e9 + 7;

// 解决问题的主要函数
void solve()
{
    // 计算字符串 a 第一个字符的哈希值
    cnt_a[0] = a[0] - 'a' + 1;
    // 计算字符串 a 其余位置的哈希值
    for (int i = 1; i < a.size(); i++)
    {
        cnt_a[i] = (cnt_a[i - 1] * p + a[i] - 'a' + 1) % mod;
    }
    // 计算字符串 b 第一个字符的哈希值
    cnt_b[0] = b[0] - 'a' + 1;
    // 计算字符串 b 其余位置的哈希值
    for (int i = 1; i < b.size(); i++)
    {
        cnt_b[i] = (cnt_b[i - 1] * p + b[i] - 'a' + 1) % mod;
    }
    int ans = 0;
    int cnt = 1;
    for (int i = 1; i <= min(a.size(), b.size()); i++)
    {
        cnt *= p; 
        cnt %= mod; 
        // 比较字符串 a 和 b 的子串是否相同
        if (cnt_a[i - 1] == (cnt_b[b.size() - 1] + mod - cnt * cnt_b[b.size() - i - 1] % mod) % mod)
        {
            ans = max(ans, i);  
        }
        if (cnt_b[i - 1] == (cnt_a[a.size() - 1] + mod - cnt * cnt_a[a.size() - i - 1] % mod) % mod)
        {
            ans = max(ans, i);
        }
    }
    cout << ans << endl;
}

// 主函数
signed main()
{
    read();  // 调用读取函数
    solve();  // 调用解决问题的函数
    return 0;
}

标签:cnt,string,int,哈希,字符串,mod,刷题,奇遇记
From: https://blog.csdn.net/resco/article/details/144199598

相关文章

  • 刷题分享12-2日
    刷题分享1.(力扣131)这是一道分割子串的问题,其核心在于理解清除startindex即为当前切割线,而每一层对应的startindex-I这个区间,其实就是当前分割出来的子串classSolution{public:vector<vector<string>>res;vector<string>path;booljudge(strings,int......
  • 力扣刷题TOP101:10.BM12 单链表的排序
    目录:目的思路复杂度记忆秘诀python代码目的{1,3,2,4,5}排序变成{1,2,3,4,5}思路这个任务是将无序单链表变成有序表。推荐使用归并算法。可以理解为汉武帝的推恩令政策(分治思想)。将大块封地分成小块封地(分割链表),对小封地进行整顿,确保符合中央标准(分到最小),将整治......
  • 刷题分享11_30
    刷题分享1.(力扣216)这是一道回溯算法的经典题目。对于回溯算法,一般backtracking是没有返回值的,参数也比较不固定,需要根据每个题的特点来具体分析。这道题因为不能取到重复元素,所以需要额外加一个参数startindex,用来记录每一次开始时所应该取到的元素。在循环内部,一般的逻......
  • 刷题分享12_1
    刷题分享1.(力扣39)这是一道回溯算法相关题目,因为每一个元素可以多次使用,所以更新时startindex应该更新为i而不是i+1classSolution{public:vector<vector<int>>res;vector<int>path;voidbacktracking(vector<int>&candidates,inttarget,intsum,......
  • hot100-一刷-01哈希(共3道题)
    1.两数之和题目链接题目描述代码实现分析:暴力的话就是两个for循环依次寻找相加为target的两个数。用一个map记录已经遍历过的数,其中key就用这个数的字面值,value就存它的下标。判断是否相加为taget的时候,只需要看map中是否有target-nums[i]就可以,说明当前的nums[i]和之前......
  • 蓝桥杯备考冲刺必刷题(Python) | 548 时间加法
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】现在时间是a点b分,请问t分钟后,是几点几分?【输入】输入的第一行包含一个整数a。第二行包含一个整数b.第三行包含一个整数t......
  • 蓝桥杯备考冲刺必刷题(Python) | 760 数的计算
    学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。附上汇总贴:蓝桥杯备考冲刺必刷题(Python)|汇总-CSDN博客【题目描述】输入一个自然数n(n≤1000),我们对此自然数按照如下方法进行处理:1.不作任何处理;2.在它的左边加上一个自然数,但该自然数不能超......
  • 【Leecode】Leecode刷题之路第66天之加一
    题目出处66-加一-题目出处题目描述个人解法思路:todo代码示例:(Java)todo复杂度分析todo官方解法66-加一-官方解法方法1:找出最长的后缀9思路:代码示例:(Java)publicclassSolution1{publicint[]plusOne(int[]digits){intn=di......
  • 【Leecode】Leecode刷题之路第65天之有效数字
    题目出处65-有效数字-题目出处题目描述个人解法思路:todo代码示例:(Java)todo复杂度分析todo官方解法65-有效数字-官方解法方法1:确定有效状态自动机思路:代码示例:(Java)publicclassSolution1{publicbooleanisNumber(Strings){......
  • 【Leecode】Leecode刷题之路第64天之最小路径和
    题目出处64-最小路径和题目描述个人解法思路:todo代码示例:(Java)todo复杂度分析todo官方解法64-最小路径和-官方解法方法1:动态规划思路:代码示例:(Java)publicclassSolution1{publicintminPathSum(int[][]grid){if(grid==......