Pagini recente » Cod sursa (job #813329) | Cod sursa (job #3315822) | Cod sursa (job #2164476) | Cod sursa (job #107325) | Cod sursa (job #2183633)
#include<bits/stdc++.h>
using namespace std;
struct trie{
int cnt, nf;
trie* fiu[27];
trie(){
cnt=nf=0;
memset(fiu, 0, sizeof(fiu));
}
};
trie *t=new trie;
string y;
void add(trie *nod, int i){
if(y[i]=='\n'){
nod->cnt ++;
return;
}
if(nod->fiu[y[i]-'a']==0){
nod->fiu[y[i]-'a']=new trie;
nod->nf ++;
}
add(nod->fiu[y[i]-'a'], i+1);
}
int del(trie *nod, int i){
if(y[i]=='\n'){
nod->cnt--;
}else if(del(nod->fiu[y[i]-'a'], i+1)){
nod->fiu[y[i]-'a']=0;
nod->nf--;
}
if(nod->cnt==0 && nod!=t && nod->nf==0){
delete nod;
return 1;
}
return 0;
}
int que(trie *nod, int i){
if(y[i]=='\n'){
return nod->cnt;
}
if(nod->fiu[y[i]-'a'])return que(nod->fiu[y[i]-'a'],i+1);
return 0;
}
int pre(trie *nod, int i){
if(y[i]=='\n' || nod->fiu[y[i]-'a']==0){
return i;
}
return pre(nod->fiu[y[i]-'a'], i+1);
}
int main(){
ifstream f("trie.in");
ofstream g("trie.out");
int x;
while(f>>x>>y){
y+='\n';
if(x==0){
add(t, 0);continue;
}
if(x==1){
del(t, 0);continue;
}
if(x==2){
g<<que(t,0)<<'\n'; continue;
}
g<<pre(t,0)<<'\n';
}
}