CF1200E Compress Words(hash/kmp)

题意:

在这里插入图片描述
(翻译来源:洛谷)

解题思路:

Hash做法

  • 最常用的hash是进制hash
  • 所以我们只要依次判断每个添加进来的字符串的每个长度,替换掉答案字符串后缀的同样长度,hash值是否相等即可
hans1[lans] == (h1 + hans1[lans - j] * ex1[j] % mod1) % mod1
//这段是替换答案后j个长度的字符串(可以将其与进制向左移联系在一起)

Kmp做法

  • 待续…

AC代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
typedef long long ll;
ll n, lans, b1, b2, mod1 = 10001227, mod2 = 10001603;
ll h1[maxn], h2[maxn], ex1[maxn], ex2[maxn];
ll hans1[maxn], hans2[maxn];
char ans[maxn], s[maxn];
void init() {
    ex1[0] = ex2[0] = 1;
    b1 = rand() % 321 + 233;//指数还是取随机数比较好,取2,3容易被卡
    b2 = rand() % 233 + 321;
    for (int i = 1; i < maxn; i++)
        ex1[i] = ex1[i - 1] * b1 % mod1, ex2[i] = ex2[i - 1] * b2 % mod2;
} 
int main() {
    srand(time(0));
    init();
    //cout << b1 << " " << b2 << endl;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> s + 1;
        int ls = strlen(s + 1), p = 0;
        ll h1 = 0, h2 = 0;
        // cout << hans1[lans] << " " << hans2[lans] << endl;
        for (int j = 1; j <= lans && j <= ls; j++) {
            h1 = (h1 * b1 % mod1 + s[j]) % mod1;
            h2 = (h2 * b2 % mod2 + s[j]) % mod2;
            // cout << h1 << " " << h2 << endl;
            if (hans1[lans] == (h1 + hans1[lans - j] * ex1[j] % mod1) % mod1 && hans2[lans] == (h2 + hans2[lans - j] * ex2[j] % mod2) % mod2)
                p = j;
        }
        //cout << p << endl;
        for (int j = p + 1; j <= ls; j++) {
            ans[++lans] = s[j];
            hans1[lans] = (hans1[lans - 1] * b1 % mod1 + s[j]) % mod1;
            hans2[lans] = (hans2[lans - 1] * b2 % mod2 + s[j]) % mod2;
        }
    }
    // cout << lans << endl;
    cout << ans + 1 << endl;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值