Pagini recente » Cod sursa (job #1495488) | Cod sursa (job #1282376) | Cod sursa (job #1204145) | Cod sursa (job #855259) | Cod sursa (job #2287447)
#include <bits/stdc++.h>
using namespace std;
struct trie
{
struct trie *copil[28];
int eow;
int rang;
};
struct trie *creaza(void)
{
trie *tnode=new trie;
tnode->rang=0;
tnode->eow=0;
for (int i=0;i<=27;i++)
tnode->copil[i]=NULL;
};
trie *root=creaza();
void insert(string s)
{
trie *curent=root;
for (int i=0;i<s.size();i++)
{
int n=s[i]-'a';
if (!curent->copil[n])
curent->copil[n]=creaza();
curent->rang++;
curent=curent->copil[n];
}
curent->eow++;
}
int apare(string s)
{
trie *curent=root;
for (int i=0;i<s.size();i++)
{
int n=s[i]-'a';
if (!curent->copil[n])
return 0;
curent=curent->copil[n];
}
return curent->eow;
}
int pref(string s)
{
trie *curent=root;
for (int i=0;i<s.size();i++)
{
int n=s[i]-'a';
if (!curent->copil[n])
return i;
curent=curent->copil[n];
}
return s.size();
}
bool sterge(string s,int l,trie *nod)
{
if (l==s.size())
{
nod->eow--;
if (nod->rang) return 0; else return 1;
}
int n=s[l]-'a';
if (sterge(s,l+1,nod->copil[n]))
{
nod->copil[n]=NULL;
if (nod->eow) {nod->rang--; return 0;}
if (nod->rang>1) {nod->rang--; return 0;}
return 1;
}
}
ifstream fin("trie.in");
ofstream fout("trie.out");
int i,j,m,n,a,b;
string s;
int main()
{
while (!fin.eof())
{
fin>>i>>s;
if (fin.eof()) break;
if (i==0) insert(s);
if (i==1) b=sterge(s,0,root);
if (i==2) fout<<apare(s)<<"\n";
if (i==3) fout<<pref(s)<<"\n";
}
return 0;
}