Pagini recente » Cod sursa (job #1631079) | Cod sursa (job #1314047) | Cod sursa (job #1467289) | Cod sursa (job #1729205) | Cod sursa (job #1467425)
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <time.h>
#include <bitset>
#include <string>
#include <vector>
#include <math.h>
#include <stack>
#include <queue>
#include <list>
#include <set>
#include <limits.h>
#include <algorithm>
#include <deque>
#define nmax 100010
#define mod 1999999973
using namespace std;
struct trie { int c,l; trie *f[26];
trie() {
c=0; l=0;
for (int i=0;i<26;i++) f[i]=NULL;
}
};
int n,i,tip; char c;
char s[25];
trie *root;
void add_word()
{
int i=1; trie *a=root;
while (i<=n && a->f[s[i]-97]!=NULL) a=a->f[s[i]-97],a->l++,i++;
for (;i<=n;i++) {
a->f[s[i]-97]=new trie; a=a->f[s[i]-97]; a->l=1;
}
a->c++;
}
void delete_word()
{
int i=1; trie *a=root;
while (i<=n && a->f[s[i]-97]!=NULL) {
if (a->f[s[i]-97]->l==1) { a->f[s[i]-97]=NULL; return; } else
{
a=a->f[s[i]-97]; a->l--; i++;
}
}
if (i>n) a->c--;
}
int nrword()
{
int i=1; trie *a=root;
while (i<=n && a->f[s[i]-97]!=NULL) a=a->f[s[i]-97],i++;
if (i>n) return (a->c); else return 0;
}
int longestprefix()
{
int i=1; trie *a=root;
while (i<=n && a->f[s[i]-97]!=NULL) a=a->f[s[i]-97],i++;
return (i-1);
}
int main() {
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
root=new trie;
while (scanf("%d %s",&tip,s+1)>0) {
n=strlen(s+1);
switch (tip) {
case 0:{ add_word(); break; }
case 1:{ delete_word(); break; }
case 2:{ printf("%d\n",nrword()); break; }
case 3:{ printf("%d\n",longestprefix()); break; }
}
}
return 0;
}