CF25E 字符串哈希/KMP

本文介绍了一种利用字符串哈希解决三个字符串拼接问题的方法,并对比了KMP算法的应用。通过具体的C++代码实现展示了如何计算最短的包含三个字符串的总串长度。

题意:
给定三个串,求包含这三个串的总串的最小长度。
思路:
字符串哈希。
当然,也可以用KMP,然而我自己没有想到,看来对KMP的理解仍然不够深。
这里也引用一下其他博主的KMP做法。
http://blog.youkuaiyun.com/u011345136/article/details/38400395
实现:

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
const ull B = 1e8 + 7;
const int MAX_SIZE = 1e5 + 10;
const int INF = 0x3f3f3f3f;
char s[3][MAX_SIZE];
int ans;
int type[6][3] = {0,1,2,0,2,1,1,0,2,1,2,0,2,0,1,2,1,0};
bool contain(char* a, char* b)//a是否在b中出现过
{
    int al = strlen(a), bl = strlen(b);
    if(al > bl) return false;

    //计算B的al次方
    ull t = 1;
    for(int i = 0; i < al; i++) t *= B;

    //计算a和b长度为al的前缀对应的哈希值
    ull ah = 0, bh = 0;
    for(int i = 0; i < al; i++) ah = ah * B + a[i];
    for(int i = 0; i < al; i++) bh = bh * B + b[i];

    //对b不断右移一位,更新哈希值并判断
    for(int i = 0 ; i + al <= bl; i++)
    {
        if(ah == bh) return true; //b从位置i开始长度为al的字符串子串等于a
        if(i + al < bl) bh = bh * B + b[i + al] - b[i] * t;
    }
    return false;
}
//a的后缀和b的前缀相等的最大长度
int overlap(char* a, char* b)
{
    int al = strlen(a), bl = strlen(b);
    int ans = 0;
    ull ah = 0, bh = 0, t = 1;
    for(int i = 1; i <= min(al, bl); i++)
    {
        ah = ah + a[al - i] * t;
        bh = bh * B + b[i - 1];
        if(ah == bh) ans = i;
        t *= B;
    }
    return ans;
}
void solve()
{
    ans = INF;
    int l1 = 0, l2 = 0;
    for(int i = 0; i < 6; i++)
    {
        if(contain(s[type[i][0]], s[type[i][1]]))
        {
            l1 = strlen(s[type[i][0]]);
        }
        else
        {
            l1 = overlap(s[type[i][0]], s[type[i][1]]);
        }

        if(contain(s[type[i][2]], s[type[i][1]]))
        {
            l2 = strlen(s[type[i][2]]);
        }
        else
        {
            l2 = overlap(s[type[i][1]], s[type[i][2]]);
        }
        ans = min(ans, (int)(strlen(s[0]) + strlen(s[1]) + strlen(s[2]) - l1 - l2));
    }
    cout << ans << endl;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> s[0] >> s[1] >> s[2];
    solve();
    return 0;
}
vnpy) nefan@3080:~/Aigo_Trading$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple alphalens Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting alphalens Using cached https://pypi.tuna.tsinghua.edu.cn/packages/a6/93/3afd2bb2b4a7629b5c99209f1e272290b7125373e46ceb11fba14e675562/alphalens-0.4.0.tar.gz (24.0 MB) Preparing metadata (setup.py) ... error error: subprocess-exited-with-error × python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [26 lines of output] /tmp/pip-install-r8bxq8y3/alphalens_8035fd671dfc4f2aae25e4e7343254f2/versioneer.py:564: SyntaxWarning: invalid escape sequence '\s' mo = re.search(r'=\s*"(.*)"', line) Traceback (most recent call last): File "<string>", line 2, in <module> exec(compile(''' ~~~~^^^^^^^^^^^^ # This is <pip-setuptools-caller> -- a caller that pip uses to run setup.py ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...<32 lines>... exec(compile(setup_py_code, filename, "exec")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ''' % ('/tmp/pip-install-r8bxq8y3/alphalens_8035fd671dfc4f2aae25e4e7343254f2/setup.py',), "<pip-setuptools-caller>", "exec")) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<pip-setuptools-caller>", line 35, in <module> File "/tmp/pip-install-r8bxq8y3/alphalens_8035fd671dfc4f2aae25e4e7343254f2/setup.py", line 35, in <module> version=versioneer.get_version(), ~~~~~~~~~~~~~~~~~~~~~~^^ File "/tmp/pip-install-r8bxq8y3/alphalens_8035fd671dfc4f2aae25e4e7343254f2/versioneer.py", line 1480, in get_version return get_versions()["version"] ~~~~~~~~~~~~^^ File "/tmp/pip-install-r8bxq8y3/alphalens_8035fd671dfc4f2aae25e4e7343254f2/versioneer.py", line 1412, in get_versions cfg = get_config_from_root(root) File "/tmp/pip-install-r8bxq8y3/alphalens_8035fd671dfc4f2aae25e4e7343254f2/versioneer.py", line 342, in get_config_from_root parser = configparser.SafeConfigParser() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: module 'configparser' has no attribute 'SafeConfigParser'. Did you mean: 'RawConfigParser'? [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed × Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details. 如何解决
09-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值