Pagini recente » Cod sursa (job #1767402) | Cod sursa (job #2073926) | Cod sursa (job #2556178) | Cod sursa (job #984214) | Cod sursa (job #2313896)
#include<fstream>
#include<cstring>
using namespace std;
struct TRIE
{
char car;
int NrW,Pref,son,bro;
}Trie[5200026];
char w[25];
int z,o;
void A()
{
int root = 0, br = 0;
int leng = strlen (w);
for (int p = 1; p < leng; ++ p)
{
bool find = false;
for (int nod = Trie[root].son; nod; nod = Trie[nod].bro)
if (Trie[nod].car == w[p])
{
Trie[nod].Pref ++;
if (p == leng - 1)
{
Trie[nod].NrW ++;
return;
}
root = nod;
find = true;
break;
}
else br = nod;
if (find) continue;
Trie[++z].car = w[p];
if (p == leng - 1) Trie[z].NrW = Trie[z].Pref = 1;
else Trie[z].NrW = 0, Trie[z].Pref = 1;
if (! Trie[root].son) Trie[root].son = z;
else Trie[br].bro = z;
root = z;
}
}
void D()
{
int root = 0, leng = strlen (w);
for (int i = 1; i < leng; ++ i)
for (int nod = Trie[root].son; nod; nod = Trie[nod].bro)
if (Trie[nod].car == w[i])
{
Trie[nod].Pref --;
if (i == leng - 1) Trie[nod].NrW --;
root = nod;
break;
}
}
int C()
{
int root = 0, leng = strlen (w);
bool ok = true;
for (int i = 1; i < leng && ok; ++ i)
{
ok = false;
for (int nod = Trie[root].son; nod; nod = Trie[nod].bro)
if (Trie[nod].car == w[i] && Trie[nod].Pref)
{
if (i == leng - 1) return Trie[nod].NrW;
root = nod;
ok = true;
break;
}
}
return 0;
}
int M()
{
int res = 0, leng = strlen (w), root = 0;
bool ok = true;
for (int i = 1; i < leng && ok; ++ i)
{
ok = false;
for (int nod = Trie[root].son; nod; nod = Trie[nod].bro)
if (Trie[nod].car == w[i] && Trie[nod].Pref)
{
res ++;
root = nod, ok = true;
break;
}
}
return res;
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
while(f>>o)
{
f.getline(w,25);
if(!o)
A();
else if(o==1)
D();
else if(o==2)
g<<C()<<'\n';
else
g<<M()<<'\n';
}
}