Anti-Rhyme Pairs (求最长公共前缀)

题目链接:https://vjudge.net/contest/344930#problem/F

 

题目大意:给你n个字符串,让你求给定的两个串的最长公共前缀

 

题目思路:处理所给的n个字符串的Hash值,然后对于每次给定的两个串,二分长度就可以了。

值得注意的是这道题需要利用vector进行存储

 

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <stdlib.h>
 5 #include <string>
 6 #include <string.h>
 7 #include <math.h>
 8 #include <vector>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set>
13 
14 
15 #define INF 0x3f3f3f3f
16 #define LL long long
17 
18 typedef unsigned long long ull;
19 const int maxn = 1e5+10;
20 
21 char s[maxn];
22 ull base = 131;
23 ull mod = 1e9+7;
24 ull p[maxn];
25 ull h1[maxn],h2[maxn];
26 ull q[maxn];
27 int len[maxn];
28 std::vector<ull> h[maxn];
29 
30 
31 ull get_hash(ull h[],int l,int r){
32     return (h[r] - h[l-1]*p[r-l+1]);
33 }
34 
35 
36 int main() {
37     int T;
38     int cas = 1;
39     scanf("%d",&T);
40     while (T--) {
41         int n;
42         scanf("%d",&n);
43         for (int i=1;i<=n;i++) {
44             scanf("%s",s+1);
45             len[i] = strlen(s+1);
46             h[i].clear();
47             h[i].push_back(0);
48             for (int j=1;j<=len[i];j++) {
49                 h[i].push_back(h[i][j-1] * base + s[j] - 'a');
50             }
51         }
52         int q;
53         printf("Case %d:\n",cas++);
54         scanf("%d",&q);
55         while (q--) {
56             int u,v;
57             scanf("%d%d",&u,&v);
58             int l = 1,r = std::min(len[u],len[v]);
59             int ans = 0;
60             while (l <= r) {
61                 int m = (l + r) >> 1;
62                 if (h[u][m] == h[v][m]) {
63                     ans = m;
64                     l = m + 1;
65                 }
66                 else
67                     r = m - 1;
68             }
69             printf("%d\n",ans);
70         }
71     }
72     return 0;
73 }

 

全部评论

相关推荐

“无名小卒,还是名扬天下?”我知道很多人都不觉得我能走到今天这一步,当然,也包括我自己。在我的人生里,有两部作品刻下了最深的烙印:《斗破苍穹》与《龙族》。它们总被人拿来对照:一边是萧炎的桀骜轻狂,一边是路明非的怯懦衰颓。有人说,天蚕土豆没见过魂天帝,但江南见过真凯撒。我时常觉得,自己就是那个衰小孩路明非。可路明非可以开挂,我不可以;我也无数次幻想过,能拥有萧炎那般年少轻狂的人生,可我没有他与生俱来的逆天天赋。我只是个平庸的普通人,一个看过《斗破苍穹》却开不了挂的路明非,只能一步一步往上爬。从我下定决心找实习的那一刻起,我就给自己定下了目标:“我一定要为字节跳动卖命.jpg”。萧炎有他的三年之约,我有我的两年半之约(其实是一年半)。2024.11.20,科大讯飞的第一封实习offer落进邮箱,我迈出了这场奔赴的第一步。2025.8.18,放弃百度转正的安稳机会,转身走进前路未卜的不确定里。我很感谢我在百度的mentor,是她从茫茫人海选中了我,给了我大厂实习的机会。即便有段时间我状态差、产出不理想,她依旧愿意认可我、希望我留下转正。2025.11.14,我选择走进字节跳动,以实习生的身份重新出发。2026.3.25&nbsp;-&nbsp;3.31,一周速通上海飞书,幸遇赏识我的伯乐,斩获Special&nbsp;Offer。被告知面试通过的那一刻,我的内心无比平静,就像这个offer本就该属于我。不是侥幸,是应得的。这一路,有人看轻过我的出身,不相信我能走到这里;也有人在我看不见前路的时候,替我举过灯。没有他们的鼓励与支撑,就没有今天站在这里的我。我看到了自强不息的激荡,那是一个双非的伟大乐章!我是雨夜迈巴赫,我要开启属于我的新篇章了。
在看牛客的本杰明很勇...:真心祝贺l总 我永远的偶像 我滴神
春招至今,你收到几个面试...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务