Pagini recente » Cod sursa (job #2846305) | Cod sursa (job #1237097) | Cod sursa (job #2951608) | Cod sursa (job #1948593) | Cod sursa (job #875951)
Cod sursa(job #875951)
#include <cstdio>
#include <cstring>
using namespace std;
struct nod
{
int cuv, found;
nod *fiu[26];
}*T;
void init(nod *&T){
T = new nod;
T->cuv = 0;
T->found = 0;
for (int i=0; i<26; ++i) T->fiu[i] = NULL;
}
void add(char *S){
int i, n=strlen(S);
nod *t = T;
for (i=0; i<n; ++i){
if (t->fiu[S[i]-'a'] == NULL) init(t->fiu[S[i]-'a']);
t = t->fiu[S[i]-'a'];
++t->cuv;
}
++t->found;
}
void del(char *S){
int i, n=strlen(S);
nod *t = T;
for (i=0; i<n; ++i){
t = t->fiu[S[i]-'a'];
t->cuv--;
}
t->found--;
}
int count(char *S){
int i, n=strlen(S);
nod *t = T;
for (i=0; i<n; ++i){
t = t->fiu[S[i]-'a'];
if (t == NULL || !t->cuv) return 0;
}
return t->found;
}
int common(char *S)
{
int i, n=strlen(S), cnt=0;
nod *man = T;
for (i=0; i<n && man->fiu[S[i]-'a']; ++i){
man = man->fiu[S[i]-'a'];
if (!man->cuv) break;
++cnt;
}
return cnt;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int c; char S[30], *p;
init(T);
while (gets(S)){
c = S[0]-'0';
p = S+2;
switch (c){
case 0: add(p); break;
case 1: del(p); break;
case 2: printf("%d\n", count(p)); break;
case 3: printf("%d\n", common(p)); break;
}
}
return 0;
}