Pagini recente » Cod sursa (job #820290) | Cod sursa (job #510720) | Cod sursa (job #1952841) | Cod sursa (job #2538477) | Cod sursa (job #2138574)
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct node{
int term,cuv;
node* next[26];
node()
{
memset(next,0,sizeof(next));
term=0;
}
};
node *root,*it;
int n;
void add(char *sir)
{
n=strlen(sir);
for(int i=0;i<n;i++)
{
if(!it->next[sir[i]-'a'])
{
it->next[sir[i]-'a']=new node;
it->term++;
}
it=it->next[sir[i]-'a'];
}
it->cuv++;
}
bool del(node *it,char *sir)
{
if(*sir==0)
{
it->cuv--;
if(it->cuv==0 && it->term==0)
{
delete(it);
return 1;
}
return 0;
}
if(del(it->next[*sir-'a'],sir+1)==1)
{
it->next[*sir-'a']=0;
it->term--;
if(it->cuv==0 && it->term==0 && it!=root)
{
delete(it);
return 1;
}
return 0;
}
}
int apar(char *sir)
{
n=strlen(sir);
for(int i=0;i<n;i++)
{
if(it->next[sir[i]-'a'])
it=it->next[sir[i]-'a'];
else return 0;
}
return it->cuv;
}
int prefix(char *sir)
{
n=strlen(sir);
int i;
for(i=0;i<n;i++)
{
if(it->next[sir[i]-'a'])
it=it->next[sir[i]-'a'];
else
return i;
}
return n;
}
int main()
{
int op;
char sir[25];
root=new node;
while(f>>op)
{
f>>sir;
it=root;
if(op==0)
add(sir);
if(op==1)
del(root,sir);
if(op==2)
g<<apar(sir)<<'\n';
if(op==3)
g<<prefix(sir)<<'\n';
}
return 0;
}