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
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值