给两个最多100000长度的字符串,求出他们的最长公共子串。
最长公共子串存在单调性 -- 如果两个串存在长度为k的公共子串,那么必然存在长度0到k-1的公共子串。
利用其单调性,先二分公共子串长度len,再用O(n)时间算出两个串各自长度为len的子串哈希值,再用O(nlogn)时间对计算得到的值排序+二分查找若存在相同的哈希值,则存在长度为len的公共子串。
这样的做法总体复杂度为O(logn * nlogn),100000的数据能过。可以优化的地方就是,比较是否存在两个相同哈希值的时候,再进一次哈希,只需用O(n),这样总体复杂度就为O(logn * n)
哈希后二分 1000+ms
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
using namespace std;
#define maxn 100007