Pagini recente » Cod sursa (job #539515) | Cod sursa (job #25099) | Cod sursa (job #141967) | Cod sursa (job #1935292) | Cod sursa (job #2856304)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trieNode
{
trieNode *nxt[26];
int words, prefs;
};
trieNode *root;
void init(trieNode *&p)
{
p=new trieNode;
for(int i=0; i<26; i++)
p->nxt[i]=NULL;
p->words=0;
p->prefs=0;
}
void addWord(string s, int add)
{
int sz=s.size();
trieNode *p=root;
for(int i=0; i<sz; i++)
{
trieNode *q=p->nxt[s[i]-'a'];
if(q==NULL)
{
init(q);
p->nxt[s[i]-'a']=q;
}
p=q;
p->prefs+=add;
if(i==sz-1)
p->words+=add;
}
}
int howMany(string s)
{
int sz=s.size();
trieNode *p=root;
for(int i=0; i<sz; i++)
{
p=p->nxt[s[i]-'a'];
if(p==NULL)
return 0;
}
return p->words;
}
int longestPrefix(string s)
{
int sz=s.size();
trieNode *p=root;
for(int i=0; i<sz; i++)
{
p=p->nxt[s[i]-'a'];
if(p==NULL)
return i;
if(p->prefs==0)
return i;
}
return sz;
}
int main()
{
int op;
string s;
init(root);
while(fin >> op >> s)
{
if(op==0)
addWord(s, 1);
else if(op==1)
addWord(s, -1);
else if(op==2)
fout << howMany(s) << "\n";
else
fout << longestPrefix(s) << "\n";
}
return 0;
}