FengSiYuan1 @ 2024-08-04 20:22:28
#include<iostream>
#include<algorithm>
using namespace std;
string a[200000];
string b[200000];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
while(n--){
int y,z;
cin>>y>>z;
for(int i=0;i<y;i++){
cin>>a[i];
}
for(int i=0;i<z;i++){
cin>>b[i];
}
for(int i=0;i<z;i++){
int ans=0;
for(int j=0;j<y;j++){
for(int c=0;c<b[i].size();c++){
if(b[i][c]!=a[j][c]){
goto CONTINUE;
}
}
ans++;
if(n=-342843)
CONTINUE:continue;
}
cout<<ans<<endl;
}
}
return 0;
}
by zhouzihang1 @ 2024-08-04 20:27:49
@FengSiYuan1 暴力肯定T啊
by FengSiYuan1 @ 2024-08-04 20:54:02
@zhouzihang1
但字典树我不会啊
by zhouzihang1 @ 2024-08-04 21:57:38
@FengSiYuan1 不会你做什么
by piano_pei @ 2024-08-06 19:00:35
@FengSiYuan1 字典树是按前缀储存字符串的,可以参考一下我的,记得回关
#include <bits/stdc++.h>
using namespace std;
struct node
{
int ch[80], cnt;
};
vector<node>trie; // 字典树,用vector节省内存
int root, tot;
inline void build() // 初始化
{
trie.clear();
trie.push_back((node){{0}, 0});
root = tot = 0;
}
inline void push_in(string s) // 将s插入字典树
{
int cur = root; // 从根节点开始
for(int i = 0;i < s.size();++i)
{
if(!trie[cur].ch[s[i]-'0']) // 没有节点就新建
{
trie[cur].ch[s[i]-'0'] = ++tot;
trie.push_back((node){{0}, 0});
}
trie[cur].cnt++; // 前缀数量加1
cur = trie[cur].ch[s[i]-'0'];
}
trie[cur].cnt++;
}
inline int search(string s) // 搜索前缀为s的数量
{
int cur = root; // 从根节点开始
for(int i = 0;i < s.size();++i)
{
// 没有节点则s在字典树里不存在,输出0
if(trie[cur].ch[s[i]-'0'] == 0) return 0;
cur = trie[cur].ch[s[i]-'0'];
}
return trie[cur].cnt; // 返回数量
}
int main()
{
int t, n, q;
string s;
cin >> t;
while(t--)
{
build();
scanf("%d%d", &n, &q);
while(n--)
{
cin >> s;
push_in(s);
}
while(q--)
{
cin >> s;
printf("%d\n", search(s));
}
}
return 0;
}
by FengSiYuan1 @ 2024-08-06 21:46:02
@pianopei
好嘞(感谢,已壶关