Pagini recente » Cod sursa (job #1257286) | Cod sursa (job #809302) | Cod sursa (job #1746533) | Cod sursa (job #1813875) | Cod sursa (job #3040583)
#include <fstream>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct nod
{
int u;
int c;
nod *f[30];
};
nod* creeaza ()
{
nod *nou = new nod;
nou->c = 0;
nou->u = 0;
int i;
for(i=0;i<=28;i++)
nou->f[i] = NULL;
return nou;
}
char s[25];
void golire (char x[])
{
int i;
for(i=0;x[i];i++)
x[i] = '\0';
}
void adauga (nod* rad,char s[])
{
int i;
for (i=0;i<s[i];i++)
{
int v = s[i]-'a';
if (!rad->f[v])
rad->f[v] = creeaza();
rad = rad->f[v];
rad->c++;
}
rad->u++;
}
void sterge(nod* rad,char s[])
{
int i;
for (i=0;i<s[i];i++)
{
int v = s[i]-'a';
rad = rad->f[v];
rad->c--;
}
rad->u--;
}
int aparitii (nod* rad,char s[])
{
int i;
for (i=0;i<s[i];i++)
{
int v = s[i]-'a';
if (!rad->f[v])
return 0;
rad = rad->f[v];
}
return rad->u;
}
int lcp (nod* rad,char s[])
{
int i;
for (i=0;i<s[i];i++)
{
int v = s[i]-'a';
if (!rad->f[v])
return i;
rad = rad->f[v];
if (rad->c == 0)
return i;
}
return i;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
nod *r = creeaza();
int t;
while (cin >> t >> s)
{
if (t==0)
{
adauga(r,s);
golire(s);
continue;
}
if(t==1)
{
sterge(r,s);
golire(s);
continue;
}
if(t==2)
{
cout << aparitii(r,s)<<'\n';
golire(s);
continue;
}
cout << lcp(r,s) << '\n';
golire(s);
}
return 0;
}