Pagini recente » Borderou de evaluare (job #1528415) | Borderou de evaluare (job #1581521) | Cod sursa (job #435537) | Monitorul de evaluare | Cod sursa (job #872005)
Cod sursa(job #872005)
#include <cstdio>
#include <cstring>
using namespace std;
struct nod
{
int cuv, found;
nod *fiu[26];
}*T;
void init(nod *&T)
{
T = new nod;
T->cuv = 0;
T->found = 0;
for (int i=0; i<26; ++i)
T->fiu[i] = NULL;
}
void add(char *S)
{
int i, n=strlen(S);
nod *man = T;
for (i=0; i<n; ++i)
{
if (man->fiu[S[i]-'a'] == NULL)
init(man->fiu[S[i]-'a']);
man = man->fiu[S[i]-'a'];
++man->cuv;
}
++man->found;
}
void del(char *S)
{
int i, n=strlen(S);
nod *man = T;
for (i=0; i<n; ++i)
{
man = man->fiu[S[i]-'a'];
if (man->cuv)
--man->cuv;
}
--man->found;
}
int count(char *S)
{
int i, n=strlen(S);
nod *man = T;
for (i=0; i<n; ++i)
{
man = man->fiu[S[i]-'a'];
if (man == NULL || !man->cuv)
return 0;
}
return man->found;
}
int common(char *S)
{
int i, n=strlen(S), cnt=0;
nod *man = T;
for (i=0; i<n && man->fiu[S[i]-'a']; ++i)
{
man = man->fiu[S[i]-'a'];
if (!man->cuv) break;
++cnt;
}
return cnt;
}
int main()
{
freopen("trie.in", "r", stdin);
freopen("trie.out", "w", stdout);
int c; char S[30], *p;
init(T);
while (gets(S))
{
c = S[0]-'0';
p = S+2;
switch (c)
{
case 0: add(p); break;
case 1: del(p); break;
case 2: printf("%d\n", count(p)); break;
case 3: printf("%d\n", common(p)); break;
}
}
return 0;
}