Loading... 给定两个字符串,求这两个字符串的**不包含数字** 的最长公共子串的长度。 #### 输入格式 共两行,每行一个由小写字母和数字构成的字符串。 #### 输出格式 一个整数,表示给定两个字符串的**不包含数字** 的最长公共子串的长度。 如果不存在满足要求的非空公共子串,则输出 **0**0。 #### 数据范围 输入字符串的长度均不超过 **10000**10000。 #### 输入样例: ``` ab123abccff abcfacb123 ``` #### 输出样例: ``` 3 ``` ```C++ #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int N = 20010, P = 131; ull p[N], h[N]; char str[N]; int n, m; ull get(int l, int r) { return h[r] - h[l - 1] * p[r - l + 1]; } bool check(int mid) { unordered_set<ull> hash; for(int i = 1; i + mid - 1 <= n; i++){ hash.insert(get(i, i + mid - 1)); } for (int i = n + 1; i + mid - 1 <= n + m; i++) { if (hash.count(get(i, i + mid - 1))) return true; } return false; } int main() { cin >> str + 1; n = strlen(str + 1); cin >> str + n + 1; m = strlen(str + n + 1); p[0] = 1; for (int i = 1; i <= n + m; i++) { p[i] = p[i - 1] * P; char c = str[i]; if (isdigit(c)) { if (i <= n) c = '#'; else c = '$'; } h[i] = h[i - 1] * P + c; } int l = 0, r = min(n, m); while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; else r = mid - 1; } cout << l << endl; return 0; } ``` 最后修改:2024 年 02 月 23 日 12 : 37 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信
12 条评论
对国际规则的解读具有前瞻性。
《两个遥远的陌生人》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/12436.html
《连环杀局1风云花戏楼》动作片高清在线免费观看:https://www.jgz518.com/xingkong/22447.html
每次看到你的文章,我都觉得时间过得好快。 https://www.4006400989.com/qyvideo/86719.html
《连环杀局1风云花戏楼》动作片高清在线免费观看:https://www.jgz518.com/xingkong/22447.html
你的文章让我感受到了无尽的欢乐,谢谢分享。 https://www.yonboz.com/video/65275.html
你的文章内容非常精彩,让人回味无穷。 https://www.4006400989.com/qyvideo/78579.html
破解玩传奇私服卡顿之谜:揭秘背后惊天秘密,告别游戏延迟!:https://501h.com/fugu/2024-07-31/24529.html
不错不错,我喜欢看 https://www.ea55.com/
想想你的文章写的特别好https://www.237fa.com/
怎么收藏这篇文章?
叼茂SEO.bfbikes.com