Pagini recente » Cod sursa (job #694589) | Cod sursa (job #2702632) | Cod sursa (job #2787966) | Cod sursa (job #1453552) | Cod sursa (job #2458448)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trieNode
{
int cntEnd;
int cnt;
trieNode *nxt[26];
trieNode()
{
cntEnd = 0;
cnt = 0;
for(int i = 0; i < 26; i++)
nxt[i] = NULL;
}
};
trieNode *root;
int t;
string S;
void insert(string S)
{
trieNode *currNode = root;
for(int i = 0; i < S.size(); i++)
{
if(currNode -> nxt[S[i] - 'a'] == NULL)
currNode -> nxt[S[i] - 'a'] = new trieNode;
currNode = currNode -> nxt[S[i] - 'a'];
currNode -> cnt++;
}
currNode -> cntEnd++;
}
void dilit(string &S, int idx, trieNode *currNode)
{
if(idx == S.size())
{
currNode -> cntEnd--;
return;
}
dilit(S, idx + 1, currNode -> nxt[S[idx] - 'a']);
currNode -> nxt[S[idx] - 'a'] -> cnt--;
if(currNode -> nxt[S[idx] - 'a'] -> cnt == 0)
{
delete currNode -> nxt[S[idx] - 'a'];
currNode -> nxt[S[idx] - 'a'] = NULL;
}
}
int getCntEnd(string S)
{
trieNode *currNode = root;
for(int i = 0; i < S.size(); i++)
{
if(currNode -> nxt[S[i] - 'a'] == NULL)
return 0;
currNode = currNode -> nxt[S[i] - 'a'];
}
return currNode -> cntEnd;
}
int lgPf(string S)
{
trieNode *currNode = root;
for(int i = 0; i < S.size(); i++)
{
if(currNode -> nxt[S[i] - 'a'] == NULL)
return i;
currNode = currNode -> nxt[S[i] - 'a'];
}
return S.size();
}
int main()
{
root = new trieNode;
while(fin >> t >> S)
{
switch(t)
{
case 0:
{
insert(S);
break;
}
case 1:
{
dilit(S, 0, root);
break;
}
case 2:
{
fout << getCntEnd(S) << "\n";
break;
}
case 3:
{
fout << lgPf(S) << "\n";
break;
}
}
}
return 0;
}