Pagini recente » Cod sursa (job #296807) | Cod sursa (job #1266141) | Cod sursa (job #1427549) | Cod sursa (job #1651441) | Cod sursa (job #1891502)
#include <bits/stdc++.h>
#define C (*s - 'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie{
int wo,pf;
trie *edge[26];
trie(){
wo = pf = 0;
memset (edge,0,sizeof( edge ));
}
};
trie *T = new trie;
void addw(trie *nod, char *s){
if(*s == '\000'){
nod ->wo++; return;
}
if(nod -> edge[C] == 0){
nod -> edge[C] = new trie;
nod -> pf ++;
}
addw(nod ->edge[C], s + 1);
}
int deletew(trie *nod,char *s){
if(*s == '\000'){
nod ->wo--;
} else if(deletew(nod ->edge[C],s + 1)){
nod ->edge[C] = 0;
nod ->pf --;
}
if(nod->wo == 0 && nod ->pf == 0 && nod != T){
delete nod; return 1;
}
return 0;
}
int queryw(trie *nod,char *s){
if(*s == '\000')
return nod ->wo;
if(nod ->edge[C])
return queryw(nod ->edge[C], s + 1);
return 0;
}
int querys(trie *nod,char *s,int l){
if(nod ->edge[C] == 0 || *s == '\000')
return l;
return querys(nod ->edge[C],s + 1,l + 1);
}
int main()
{
ios :: sync_with_stdio(false);
char S[32];
while(fin.getline(S,sizeof(S))){
if(S[0] == '0')
addw(T,S + 2);
if(S[0] == '1')
deletew(T,S + 2);
if(S[0] == '2')
fout << queryw(T,S + 2) << "\n";
if(S[0] == '3')
fout << querys(T,S + 2,0) << "\n";
}
return 0;
}