Pagini recente » Cod sursa (job #2901114) | Cod sursa (job #2144151) | Cod sursa (job #2617031) | Cod sursa (job #247246) | Cod sursa (job #2287469)
#include <bits/stdc++.h>
using namespace std;
struct trie
{
struct trie *copil[30];
int eow;
int rang;
trie()
{
rang=0;
eow=0;
for (int i=0;i<=27;i++)
copil[i]=NULL;
}
};
/*struct trie *creaza(void)
{
struct trie *tnode=new trie;
tnode->rang=0;
tnode->eow=0;
for (int i=0;i<=27;i++)
tnode->copil[i]=NULL;
return tnode;
};*/
void insert(string s,trie *curent)
{
for (int i=0;i<s.size();i++)
{
int n=s[i]-'a';
if (!curent->copil[n])
curent->copil[n]=new trie;
curent->rang++;
curent=curent->copil[n];
}
curent->eow++;
}
int apare(string s,trie *curent)
{
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)
{
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,struct 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;
trie *root=new trie;
int main()
{
while (!fin.eof())
{
fin>>i>>s;
if (fin.eof()) break;
if (i==0) insert(s,root);
if (i==1) b=sterge(s,0,root);
if (i==2) fout<<apare(s,root)<<"\n";
if (i==3) fout<<pref(s,root)<<"\n";
}
return 0;
}