
struct trie { int tree[maxn][30],sum[maxn],flag[maxn],tot; void insert_(char *str) { int len = strlen(str); int root = 0; for (int i = 0; i < len; i++) { int id = str[i] - 'a'; if (!tree[root][id]) { tree[root][id] = ++tot; } sum[tree[root][id]]++; root = tree[root][id]; } flag[root]=1; } bool search_(char *str) { int len = strlen(str); int root = 0; for (int i = 0; i < len; i++) { int id = str[i] - 'a'; if (!tree[root][id]) { return 0; } root = tree[root][id]; } if (flag[root]) { return 1; } return 0; } void init() { for (int i=0; i<=tot; i++) { flag[i]=sum[i]=0; for (int j=0; j<30; j++) { tree[i][j]=0; } } tot=0; } } T;
#include<bits/stdc++.h> using namespace std; const int maxn=2e6+5; int sum[maxn],flag[maxn]; char s[maxn]; struct trie { int tree[maxn][30],tot; void insert_(char *str) { int len = strlen(str); int root = 0; for (int i = 0; i < len; i++) { int id = str[i] - 'a'; if (!tree[root][id]) { tree[root][id] = ++tot; } sum[tree[root][id]]++; root = tree[root][id]; } flag[root]=1; } int search_(char *str) { int len = strlen(str); int root = 0; for (int i = 0; i < len; i++) { int id = str[i] - 'a'; if (!tree[root][id]) { return 0; } root = tree[root][id]; } return sum[root]; } }T; int main(){ while (gets(s)){ if (s[0]==' '){ break; } T.insert_(s); } while (~scanf("%s",s)){ printf("%d ",T.search_(s)); } }
#include<bits/stdc++.h> using namespace std; const int maxn=2e6+5; int sum[maxn],flag[maxn]; char s[maxn]; struct trie { int tree[maxn][30],tot; void insert_(string str) { int len = str.length(); int root = 0; for (int i = 0; i < len; i++) { int id = str[i] - 'a'; if (!tree[root][id]) { tree[root][id] = ++tot; } sum[tree[root][id]]++; root = tree[root][id]; } flag[root]=1; } int search_(string str) { int len = str.length(); int root = 0; for (int i = 0; i < len; i++) { int id = str[i] - 'a'; if (!tree[root][id]) { return 1; } root = tree[root][id]; } if (flag[root]) { return 0; } return 1; } void init() { for (int i=0; i<tot; i++) { flag[i]=0; for (int j=0; j<30; j++) { tree[i][j]=0; } } tot=0; } } T; string str1,str2; int main() { while (getline(cin,str1)) { int ans=0; T.init(); if (str1=="#") { break; } stringstream ss(str1); while (ss>>str2) { if (T.search_(str2)) { ans++; T.insert_(str2); } } printf("%d ",ans); } }
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=2e6+5; char s[maxn][30]; int n; struct trie { int tree[maxn][30],sum[maxn],flag[maxn],tot; void insert_(char *str) { int len = strlen(str); int root = 0; for (int i = 0; i < len; i++) { int id = str[i] - 'a'; if (!tree[root][id]) { tree[root][id] = ++tot; } sum[tree[root][id]]++; root = tree[root][id]; } flag[root]=1; } string search_(char *str) { int len = strlen(str); int root = 0; string ans=""; for (int i = 0; i < len; i++) { int id = str[i] - 'a'; root = tree[root][id]; ans+=str[i]; if (sum[root]==1){ return ans; } } } void init() { for (int i=0; i<tot; i++) { flag[i]=sum[i]=0; for (int j=0; j<30; j++) { tree[i][j]=0; } } tot=0; } } T; int main() { while (~scanf("%s",&s[++n])){ T.insert_(s[n]); } for (int i=1;i<=n;i++){ printf("%s ",s[i]); cout<<T.search_(s[i])<<endl; } }