3 条题解
-
0姜逸飞 (jiangyifei) LV 6 @ 2022-11-10 20:02:32
备注: ******************************************/ #include <queue> #include <math.h> #include <stack> #include <stdio.h> #include <iostream> #include <vector> #include <iomanip> #include <string.h> #include <algorithm> #include <map> using namespace std; #define LL long long const int N = 1e6 + 10; const int INF = 0x3f3f3f3f; struct node { int a[27], end; node() { memset(a, 0, sizeof a); end = 0; } }tr[N]; int id = 0; //id表示新儿子的下标 void add(string s) { int head = 0, len = s.size(); //head表示当前节点的儿子 for(int i = 0; i < len; i++) { int k = s[i] - 96; if(!tr[head].a[k]) tr[head].a[k] = ++id; //有儿子就处理,没儿子就加一个 head = tr[head].a[k]; } tr[head].end++; } int find(string s) { int head = 0, len = s.size(), ans = 0; for(int i = 0; i < len; i++) { int k = s[i] - 96; head = tr[head].a[k]; //往下一个儿子走 if(!head) return ans; ans += tr[head].end; //tr[head].end表示以这个单词结尾的单词数量 } return ans; //没有儿子就返回ans } signed main() { //freopen(".in", "r", stdin); //freopen(".out", "w", stdout); int n, m; cin>>n>>m; for(int i = 1; i <= n; i++) { string s; cin>>s; add(s); } for(int i = 1; i <= m; i++) { string s; cin>>s; cout<<find(s)<<endl; } return 0; }
-
02022-8-25 12:04:00@
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int n,m,tot; int trie[1000010][27],cnt[1000010]; void in(char s[1000010]) { int len=strlen(s),p=0; for(int i=0;i<len;i++) { int ch=s[i]-'a'; if(!trie[p][ch]) trie[p][ch]=++tot; p=trie[p][ch]; } cnt[p]++; } int inster(char s[1000010]) { int ans=0; int len=strlen(s),p=0; for(int i=0;i<len;i++) { int ch=s[i]-'a'; p=trie[p][ch]; if(!p) return ans; ans+=cnt[p]; } return ans; } int main() { char s[1000010]; cin >> n >> m; for(int i=1;i<=n;i++) { scanf("%s",s); in(s); } for(int i=1;i<=m;i++) { scanf("%s",s); printf("%d\n",inster(s)); } return 0; }
-
02021-8-7 20:43:20@
C++ :
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define Min(a,b) (a)<(b)?(a):(b) #define Max(a,b) (a)>(b)?(a):(b) #define in(i) (i=read()) using namespace std; int read() { int ans=0,f=1; char i=getchar(); while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();} while(i>='0' && i<='9') {ans=(ans<<1)+(ans<<3)+i-'0'; i=getchar();} return ans*f; } int n,m,tot; int trie[1000010][27],cnt[1000010]; void insert(char* str) { int len=strlen(str),p=0; for(int i=0;i<len;i++) { int ch=str[i]-'a'; if(!trie[p][ch]) trie[p][ch]=++tot; p=trie[p][ch]; } cnt[p]++; } int search(char* str) { int ans=0; int len=strlen(str),p=0; for(int i=0;i<len;i++) { int ch=str[i]-'a'; p=trie[p][ch]; if(!p) return ans; ans+=cnt[p]; } return ans; } int main() { char s[1000010]; in(n); in(m); for(int i=1;i<=n;i++) { scanf("%s",s); insert(s); } for(int i=1;i<=m;i++) { scanf("%s",s); printf("%d\n",search(s)); } return 0; }
- 1
信息
- ID
- 53
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 111
- 已通过
- 56
- 上传者