Pagini recente » Cod sursa (job #3320133) | Cod sursa (job #2490174) | Diferente pentru blog/google-code-jam-2008 intre reviziile 11 si 8 | Cod sursa (job #1197501) | Cod sursa (job #3340404)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Nod
{
int cnt=0; //cate cuvinte se termina in nodul meu
int lvs=0; //nr de cuvinte care se termina in subarborele meu
int next[26]={}; //vector caracteristic
};
vector<Nod> trie;
void insert(string& s)
{
int nod=0;
for(char ch:s)
{
if(!trie[nod].next[ch-'a']) //daca nu am deja muchie pe care sa fie prima litera din cuvant
{
trie[nod].next[ch-'a']=trie.size();
Nod k;
trie.push_back(k);
}
nod=trie[nod].next[ch-'a'];
trie[nod].lvs++;
}
trie[nod].cnt++;
}
void erase(string& s)
{
int nod=0;
for(char ch:s)
{
nod=trie[nod].next[ch-'a'];
trie[nod].lvs--;
}
trie[nod].cnt--;
nod=0;
for(char ch:s)
{
if(!trie[trie[nod].next[ch-'a']].lvs)
{
trie[nod].next[ch-'a']=0;
return;
}
nod=trie[nod].next[ch-'a'];
}
}
int count(string& s)
{
int nod=0;
for(char ch:s)
{
if(!trie[nod].next[ch-'a'])
return 0;
nod=trie[nod].next[ch-'a'];
}
return trie[nod].cnt;
}
int lcp(string& s) //longest common prefix
{
int nod=0;
int lg=0;
for(char ch:s)
{
if(!trie[nod].next[ch-'a'])
return lg;
nod=trie[nod].next[ch-'a'];
lg++;
}
return lg;
}
int main()
{
int op;
string s;
Nod k;
trie.push_back(k); //push_back la primul nod - radacina
while(fin>>op>>s)
{
if(op==0) insert(s);
else
if(op==1) erase(s);
else
if(op==2)
fout<<count(s)<<'\n';
else
fout<<lcp(s)<<'\n';
}
return 0;
}