Pagini recente » Cod sursa (job #1600399) | Cod sursa (job #715611) | Cod sursa (job #2060343) | Cod sursa (job #1038459) | Cod sursa (job #1208290)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define NMAX 150001
struct Trie
{
int key;
int terminal;
int prefixes;
};
vector < Trie > L[NMAX];
int type,cnt_nodes;
char S[NMAX],ch[NMAX];
Trie NUL;
void Insert()
{
int node=0,N=strlen(S),i,j;
bool is;
Trie actual;
actual=NUL;
for (j=0;j<N;++j)
{
is=false;
for (i=0;i<L[node].size() && !is;++i)
if (ch[L[node][i].key]==S[j])
{
if (j==N-1)
++L[node][i].terminal;
++L[node][i].prefixes;
node=L[node][i].key;
is=true;
}
if (is) continue;
actual.key=++cnt_nodes;
actual.prefixes=1;
if (j==N-1)
actual.terminal=1;
L[node].push_back(actual);
ch[cnt_nodes]=S[j];
node=cnt_nodes;
}
}
void Delete()
{
int i,j,N=strlen(S),node=0;
bool is;
for (j=0;j<N;++j)
{
is=false;
for (i=0;i<L[node].size() && !is;++i)
if (ch[L[node][i].key]==S[j])
{
if (j==N-1)
--L[node][i].terminal;
--L[node][i].prefixes;
node=L[node][i].key;
is=true;
}
}
}
void Prefix()
{
int i,j,length=0,node=0,N=strlen(S);
bool is;
for (j=0;j<N;++j)
{
is=false;
for (i=0;i<L[node].size() && !is;++i)
if (ch[L[node][i].key]==S[j] && L[node][i].prefixes!=0)
{
++length;
node=L[node][i].key;
is=true;
}
if (!is)
{
printf("%d\n",length);
return ;
}
}
printf("%d\n",length);
}
void Query()
{
bool is;
int i,j,N=strlen(S),node=0;
for (j=0;j<N;++j)
{
is=false;
for (i=0;i<L[node].size() && !is;++i)
if (ch[L[node][i].key]==S[j])
{
if (j==N-1)
{
printf("%d\n",L[node][i].terminal);
return ;
}
node=L[node][i].key;
is=true;
}
if (!is)
{
printf("0\n");
return ;
}
}
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
scanf("%d%s",&type,&S);
while (!feof(stdin))
{
switch(type)
{
case 0 : Insert();
break;
case 1 : Delete();
break;
case 2 : Query();
break;
case 3 : Prefix();
break;
}
scanf("%d%s",&type,&S);
}
return 0;
}