Pagini recente » Cod sursa (job #2214548) | Cod sursa (job #2009774) | Cod sursa (job #1488175) | Cod sursa (job #264440) | Cod sursa (job #2137376)
#include <fstream>
#include <string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct node{
int term;
node* next[26];
};
node *root;
void init(node *it)
{
for(int i=0;i<26;i++)
it->next[i]=0;
it->term=0;
}
void add(char *sir)
{
int n=strlen(sir);
node *it;
it=root;
for(int i=0;i<n;i++)
{
if(!it->next[sir[i]-'a'])
{
it->next[sir[i]-'a']=new node;
init(it->next[sir[i]-'a']);
}
it->term++;
it=it->next[sir[i]-'a'];
}
it->term++;
}
void del(char *sir)
{
node *it;
it=root;
while(*sir!=0)
{
it=it->next[*sir-'a'];
it->term--;
sir++;
}
}
int apar(char *sir)
{
int n=strlen(sir);
node *it=root;
for(int i=0;i<n;i++)
{
if(it->next[sir[i]-'a'])
it=it->next[sir[i]-'a'];
else return 0;
}
int rez=it->term,i;
for(i=0;i<26;i++)
if(it->next[i])
rez-=it->next[i]->term;
return rez;
}
int prefix(char *sir)
{
node *it=root;
if(root->term==0)
return 0;
int n=strlen(sir),i;
for(i=0;i<n;i++)
{
if(it->term==0)
return i-1;
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;
init(root);
while(f>>op)
{
f>>sir;
if(op==0)
{
add(sir);
}
if(op==1)
{
del(sir);
}
if(op==2)
{
g<<apar(sir)<<'\n';
}
if(op==3)
{
g<<prefix(sir)<<'\n';
}
}
return 0;
}