首页 > 其他分享 >字符串哈希

字符串哈希

时间:2024-07-25 18:17:53浏览次数:11  
标签:字符 const 哈希 int long ull 字符串

首先对于知识点会在8月份更新,目前只是单纯的对一道题进行展示

题目链接

https://ac.nowcoder.com/acm/contest/87255/E

题意:

题目要求我们找出两个等长的字符串 a 和 b 中的“好”字符数量。一个字符被称为“好”字符,
如果它在字符串 a 和 b 的所有循环同构字符串中出现的位置是一致的。换句话说,对于每个
字符 x,要么在字符串 a 和 b 的每个位置都出现,要么都不出现。

  

思路:

​ 在对某个字符 x 进行判断时,因为我们在匹配的时候只需要考虑某个字符是否为  
x,所以我们将字符串 a 和 b根据每个字符是否为字符 x 转化为一个01串。

  

Code:

#include <bits/stdc++.h>

using namespace std;
typedef unsigned long long ull;
const int N = 1e6 + 10;
const int P = 131;
ull h1[N << 1], h2[N], p[N << 1] = {1};

void geth(ull h[], const string &s, char c) {
    int len = s.size();
    for (int i = 1; i < len; i++) {
        h[i] = h[i - 1] * P + (s[i] == c);
    }
}

ull get(const ull h[], int l, int r) {
    return h[r] - h[l - 1] * p[r - l + 1];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cout << fixed << setprecision(15); 
    int n;
    cin >> n;
    string a, b;
    cin >> a >> b;
    set<char> st(a.begin(), a.end()); 
    a = '%' + a + a;
    b = '%' + b;  
    for (int i = 1; i <= n * 2; i++) {
        p[i] = p[i - 1] * P;
    } 
    int ans = 0; 
    for (char c : st) {
        geth(h1, a, c);
        geth(h2, b, c);
        for (int i = 1; i <= n; i++) {
            if (get(h1, i, i + n - 1) == get(h2, 1, n)) {
                ans++;
                break;
            }
        }
    } 
    cout << ans;
    return 0;
}

  

标签:字符,const,哈希,int,long,ull,字符串
From: https://www.cnblogs.com/youhualiuh/p/18323862

相关文章

  • C++| STL之unordered_map(哈希表)和map
    前言:Leetcode题目中有一个哈希表的专题,自己实现的话没必要,可以直接用STL现成的unordered_map函数,提到unordered_map就不得不提到map,于是有了此篇相关知识点的汇总。unordered_map和mapkey和valueunordered_map使用map原理对比unordered_map使用对比unordered_mapke......
  • 存在重复元素 II-哈希表
    题目描述:个人题解:从左到右遍历数组nums,当遍历到下标i时,如果存在下标j<i使得nums[i]=nums[j],则当i−j≤k时即找到了两个符合要求的下标j和i。如果在下标i之前存在多个元素都和nums[i]相等,为了判断是否存在满足nums[i]=nums[j]且i−j≤k的下标j,应该在这......
  • 代码随想录 day8|| 151 翻转单词 28 字符串匹配 459 重复子串
    151翻转单词funcreverseWords(sstring)string{ //思考:判断单词条件是从0或者空格开始到终或者空格结尾,最简单方式strings.split之后变成切片,然后反转就行了 //考虑双指针,左指针指向单词首位,右指针指向单词末尾 varres[]byte varleft,rightint forright<len......
  • 在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的
    哈希表(散列表)的工作原理哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。哈希表的基本工作流程如下:哈希函数:哈希函数接受一个输入(键),并......
  • C++中字符串的拼接和比较操作
    在C++中,字符串的拼接和比较是常见的操作,这些操作可以通过标准库中的std::string类来实现。下面将分别描述字符串的拼接和比较操作。字符串拼接在C++中,std::string类提供了多种方式来拼接(或称为连接)字符串。最直接的方法是使用+操作符或append()成员函数。使用+操作符cpp复......
  • 如何将unicode编码为字节,以便可以检索到原始字符串?在Python 3.11中
    在python3.11中,我们可以对字符串进行编码,如:string.encode('ascii','backslashreplace')这对于说:hellö=>hell\\xf6但是当我插入时hellöw\\xf6rldIgethell\\xf6w\\xf6rld(注意第二个有一个看起来像字符转义序列的文字部分)......
  • 在 Python 中动态定义文字字符串排列的并集
    我有一个字符串列表:strings=['a','b','c']我想声明列表中所有可能的有序对的Union类型。硬编码,这看起来像:Literal我如何动态定义CustomType=Literal['ab','ac','aa','ba','bb','bc�......
  • 需要帮助来提取此 XML 节点 - Python 中的 Excel 连接字符串
    我有一个Python程序,打开Excel(XLSX)文件,并尝试查找<connection>节点。这是connections.xml文件中的完整XML。<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><connectionsxmlns="http://schemas.op......
  • 【Python】到底什么是字符串格式化?
    字符串格式化的目的:在字符串中动态地插入数据或表达式。字符串格式化的对象:要插入到字符串中的数据。在详细解释之前,先引入第一种字符串格式化的方法name=input('请输入你的名字:')gender=input('请输入你的性别:')age=input('请输入你的年龄:')print(f'你的名字是{......
  • 翻转字符串里的单词(双指针去重思路+代码实现)
    题目①双指针思路整体思路:去重+反转数组填充类问题都可以使用双指针方式!原理如同:双指针移除元素去重其实是一种删除操作,1.双指针去重fast判断slow指向待填充位置额外再使用一个变量:isblock(判断之前是否出现过空格)连续空格的话只保留一个空格,达到去重效果遇......