首页 > 其他分享 >[题解] [CCPC陕西省赛2022 D题] Hash

[题解] [CCPC陕西省赛2022 D题] Hash

时间:2024-04-16 16:55:54浏览次数:24  
标签:Hash int 题解 CCPC ret 29 leq long mod

[CCPC陕西省赛2022 D题] Hash

题目描述

给定一个字符串 \(S\) ,按照如下方法获取 \(S\) 的哈希值:

//Language C++14
long long mod=5999993;
long long gethas(string s)
{
    long long ret=0;
    for (char c:s)
    ret=(ret*29+(c-'a'+1))%mod;
    return ret;
}

找到一个字符串 \(T\) ,使得 \(T\) 满足以下条件:

  1. \(T\) 只包括小写字母
  2. \(S\) 是 \(T\) 的前缀
  3. \(S\) 和 \(T\) 的哈希值相同
  4. \(1 \leq |T|-|S| \leq 50\),\(|S|\) 标识 \(S\) 的长度

输入格式

第一行包括一个整数 \(T(1 \leq T \leq 1000)\) 。

接下来 \(T\) 行,每行一个字符串 \(S(1 \leq |S| \leq 100)\)。且 \(S\) 只包括小写字母。

输出格式

对于每个用例,输出一行一个字符串 \(T\) 表示答案。

题解

对于每个用例,额外构造的字符串的长度都不会超过 \(50\) ,故可以枚举额外构造的字符串长度,寻找是否有 \(hash(S) + mod \times k\) 落在该长度区间内即可。注意此题的特殊性在于哈希是 \(29\) 进制,存在哈希值无法与字母对应的情况,需要额外判断一下。
该算法时间复杂度不是很正确,因此考虑优化。对于每新增 \(6\) 位,找到合法解的概率都是 $ (\frac{26}{29})^{6} \approx 51.93%$ ,因此只枚举 \(6\) 位的成功概率就极大了。

AC代码

#include <bits/stdc++.h>
#define int long long

using namespace std;
const int mod = 5999993;

inline int gethas(string s) {
    int ret = 0;
    for (int i = 0; i < s.length(); i++) {
        char ch = s[i];
        ret = (ret * 29 + (ch - 'a' + 1)) % mod;
    }
    return ret;
}

inline void unhas(int x) {
    char ors[1003];
    int cnt = 0;
    while (x > 0) {
        ors[cnt++] = (char)(x % 29 + 'a' - 1);
        x /= 29;
    }
    for (int i = cnt - 1; i >= 0; i--) {
        cout << ors[i];
    }
}

inline bool check(int x) {
    int cnt = 0;
    while (x > 0) {
        char ch = x % 29 + 'a' - 1;
        if (ch < 'a' || ch > 'z') return false;
        cnt++;
        x /= 29;
    }
    return cnt == 6;
}

int qpow(int a, int b) {
    a %= mod;
    int ans = 1;
    for (; b; b >>= 1, (a *= a) %= mod)
        if(b & 1) (ans *= a) %= mod;
    return ans;
}

signed main() {
    int t;
    cin >> t;
    while (t--) {
        string s;
        cin >> s;
        int A = gethas(s);
        bool flag = false;
        int B = A;
        while(true) {
            B = (B * (int) qpow(29, 6)) % mod;
            for (int i = 0; i <= 100; i++) {
                int B1 = A + mod * i - B;
                if (check(B1)) {
                    cout << s;
                    unhas(B1);
                    cout << '\n';
                    flag = true;
                    break;
                }
            }
            if (flag) break;
        }
    }
    return 0;
}

标签:Hash,int,题解,CCPC,ret,29,leq,long,mod
From: https://www.cnblogs.com/Floyd3265/p/18138617

相关文章

  • CF1097F Alex and a TV Show 题解
    题目链接点击打开链接题目解法很牛的套路啊!看到集合并,且只要求奇偶性的问题,第一个想到\(bitset\)\(1,2,4\)操作都是好维护的,关键是第\(3\)个操作看到$\gcd$,首先想到莫反令\(c_{x,i}\)为集合\(x\)中数\(i\)的出现次数则\(c_{x,i}=\sum\limits_{i|j}\sum\limit......
  • Pass The hash攻击
    WindowsHash分类LMHashNTLMHashNet-NTLMHashWindowsHash简介window系统内部不保存用户的明文密码,只保存密码的Hash值本机用户的密码Hash是存放SAM文件中,文件路径为:C:\Windows\System32\config\sam域内用户的密码Hash是存在域控的NTDS.DIT文件中数据库文件夹:C:\w......
  • 如何写好一篇题解?
    为什么要写题解?首先要清楚知道一点,写题解不仅是帮助别人在做题遇到困难时指明方向,更是提升自己的最快途径。经常有人问我:“如何提升自己的程序设计能力”。我都会回答:“写题解”。写题解可以帮助你彻底掌握某一个知识点。无论一道题目是否是你独立写出来的,你都应该去尝试写题解......
  • 什么是可散列(hashable)的数据类型
    在Python官方词汇表中,关于hashable类型的定义有这样一段话:Anobjectishashableifithasahashvaluewhichneverchangesduringitslifetime(itneedsahash()method),andcanbecomparedtootherobjects(itneedsaneq()method).Hashableobjectswhichcompa......
  • 取胜 题解
    很厉害的题,记录下题意是随机一棵无根树,随一个根,每条边存在(能走通)的概率为\(p\),以根为起点,每次一方选择当前点的一个能走通的儿子走过去,问先手必胜的概率.容易发现可以当成有根树.用\(F(x)\)和\(G(x)\)表示必胜树和必败树的egf,有\[\begin{cases}F(x)=xe^{F(x)}\le......
  • 开机后mysql服务未启动问题解决
    问题:mysql的启动类型设置了自动,但是电脑开机后还是需要手动启动。 解决方法:一、Win+R快捷键弹出运行框 二、输入regedit后回车 三、地址栏内输入计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control后回车 四、找到Control入径后,新建一个名称为ServicesPipe......
  • [题解][2021-2022年度国际大学生程序设计竞赛第10届陕西省程序设计竞赛] Type The Str
    题目描述给定n个字符串,有以下几种操作:打出一个字符,花费1。删除一个字符,花费1。复制并打出一个之前打出过的字符串,花费k。求打出所有n个字符串的最小花费。(注意,打出顺序和字符串输入的顺序不必相同)题解显然,操作3需要算字符串的最长公共子序列来处理。这个问题可以转换为......
  • P4298 [CTSC2008] 祭祀 题解
    P4298[CTSC2008]祭祀题解给定DAG,求最长反链长度,最长反链方案,有多少个点可以成为反链上的点。Case1熟知Dilworth定理:偏序集的最长反链的长度等于最小链划分。因为偏序集有传递性,所以我们也需要对DAG做一遍传递闭包。这样可以套用Dilworth定理,最小链划分等于点数减......
  • [题解][2021-2022年度国际大学生程序设计竞赛第10届陕西省程序设计竞赛] Hash
    题目描述给定字符串T,要求求字符串S,满足以下条件:S是T的前缀S和T运行某段代码的哈希值相同(代码见下)T只包含小写字母S和T的长度差不超过50哈希代码://LanguageC++14longlongmod=5999993;longlonggethas(strings){longlongret=0;for(charc:s)ret=......
  • PGSQL 问题解决
    1服务无法启动 这里更改安装目录bin下面例如E:\WorkingSoftware\PostgreSql\16\bin更改权限,下面都改下 2  安装时提示database出错,就初始化下执行以下命令E:\WorkingSoftware\PostgreSql\16\bin\pg_ctl.exe-DE:\WorkingSoftware\PostgreSql\16\dat......