前缀统计
前缀统计
题目描述
给定 NN 个字符串 S1,S2...SNS1,S2...SN,接下来进行 MM 次询问,每次询问给定一个字符串 TT,求 S1−SNS1−SN中有多少个字符串是 TT 的前缀。输入字符串的总长度不超过 106106,仅包含小写字母。
输入
第一行两个整数 N,MN,M。接下来 NN 行每行一个字符串 SiSi。接下来 MM 行每行一个字符串表示询问。
输出
对于每个询问,输出一个整数表示答案。
样例输入
3 2
ab
bc
abc
abc
efg
样例输出
2
0
建立一棵字典树,记录前面n个字符串,之后进来m个字符串,每进来一个就依次往下进行匹配,如果遇到已经标记为独立成词的节点就给总个数+1,最后的返回的总个数就是前缀匹配的字符串个数。(要注意如果出现匹配到某个字符突然失配的情况,就要返回已经数出来的个数。)
代码演示:
#define base 26
class Node {
public:
vector<int> next;
int flag = 0;
Node() {
next = vector<int>(26);
}
};
int cnt_node;
int root;
vector<Node>tree = vector<Node>(900000);
int get_node() {
return ++cnt_node;
}
void insert(string str) {
int p = root;
for (int i = 0;str[i]; i++) {
int ind = str[i] - 'a';
if (tree[p].next[ind] == 0)tree[p].next[ind] = get_node();
p = tree[p].next[ind];
}
tree[p].flag++;
return;
}
int find( string str) {
int cnt = 0;
int p = root;
for (int i = 0; str[i]; i++) {
int ind = str[i] - 'a';
if (tree[p].next[ind] == 0)return cnt;
p = tree[p].next[ind];
if (tree[p].flag)cnt += tree[p].flag;
}
return cnt;
}
int main() {
int n;
int m;
cin >> n;
cin >> m;
string str;
for (int i = 0; i < n; i++) {
cin >> str;
insert(str);
}
for (int i = 0; i < m; i++) {
cin >> str;
cout << find(str) << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!