Mai intai trebuie sa te autentifici.
Cod sursa(job #3232183)
Utilizator | Data | 29 mai 2024 10:46:01 | |
---|---|---|---|
Problema | Trie | Scor | 45 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 4.5 kb |
#include<bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
///hashuri
///preordine
class Hash
{
public:
int n;
list<int> *H;
list<string> *Hs;
list<string> *Prefix;
Hash(int n)
{
this->n = n;
H = new list<int>[n+5];
Hs = new list<string>[n+5];
Prefix = new list<string>[n+5];
}
~Hash()
{
delete []H;
delete []Hs;
delete []Prefix;
}
int Modulo(int x)
{
return x % n;
}
int Modulo_String(string x)
{
int i;
long long p, nr;
nr = 0;
p = 1;
for(i=0; x[i]!=0; i++)
{
nr = (nr + (x[i] - 'a' + 1) * p) % n;
p = (p * 26) % n;
}
return nr;
}
void Insert(int x)
{
int index = Modulo(x);
H[index].push_back(x);
}
void Insert_String(string x)
{
int index = Modulo_String(x);
Hs[index].push_back(x);
}
void Delete(int x)
{
int index = Modulo(x);
list <int> :: iterator it;
for (it = H[index].begin(); it != H[index].end() && *it != x; it++)
;
if(it != H[index].end()) H[index].erase(it);
}
void Delete_String(string x)
{
int index = Modulo_String(x);
list <string> :: iterator it;
for (it = Hs[index].begin(); it != Hs[index].end() && *it != x; it++)
;
if(it != Hs[index].end()) Hs[index].erase(it);
}
void Delete_Prefix(string x)
{
list <string> :: iterator it;
int i;
long long p, nr;
nr = 0;
p = 1;
for(i=0; x[i]!=0; i++)
{
nr = (nr + (x[i] - 'a' + 1) * p) % n;
p = (p * 26) % n;
for (it = Prefix[nr].begin(); it != Prefix[nr].end() && *it != x; it++)
;
if(it != Prefix[nr].end()) Prefix[nr].erase(it);
}
}
void Afisare()
{
int i;
for (i = 0; i < n; i++)
{
for (auto w : H[i])
fout << w << " ";
fout << "\n";
}
}
void Afisare_String()
{
int i;
for (i = 0; i < n; i++)
{
for (auto w : Hs[i])
fout << w << " ";
fout << "\n";
}
}
bool Find(int x)
{
int index = Modulo(x);
list<int>::iterator it;
for (it = H[index].begin(); it != H[index].end(); it++)
if (*it == x) return true;
return false;
}
int Find_All_Strings(string x)
{
int index = Modulo_String(x);
list<string>::iterator it;
int nr = 0;
for (it = Hs[index].begin(); it != Hs[index].end(); it++)
if (*it == x) nr++;
return nr;
}
bool Find_String(string x)
{
int index = Modulo_String(x);
list<string>::iterator it;
for (it = Hs[index].begin(); it != Hs[index].end(); it++)
if (*it == x) return true;
return false;
}
bool Find_Prefix(string x)
{
int index = Modulo_String(x);
list<string>::iterator it;
for (it = Prefix[index].begin(); it != Prefix[index].end(); it++)
if (*it == x) return true;
return false;
}
void Add_Prefix(string x)
{
int i;
long long p, nr;
nr = 0;
p = 1;
for(i=0; x[i]!=0; i++)
{
nr = (nr + (x[i] - 'a' + 1) * p) % n;
p = (p * 26) % n;
Prefix[nr].push_back(x.substr(0, i+1));
}
}
void Task3(string x)
{
int i, lg;
long long p, nr;
nr = lg = 0;
p = 1;
for(i=0; x[i]!=0; i++)
{
nr = (nr + (x[i] - 'a' + 1) * p) % n;
p = (p * 26) % n;
string s = x.substr(0, i + 1);
if(Find_Prefix(s) == true) lg = i + 1;
}
fout << lg << "\n";
}
};
int main()
{
int op;
Hash A(1234577);
string s;
while(fin >> op)
{
fin >> s;
if(op == 0)
{
A.Insert_String(s);
A.Add_Prefix(s);
}
else if(op == 1)
{
A.Delete_String(s);
A.Delete_Prefix(s);
}
else if(op == 2) fout << A.Find_All_Strings(s) << "\n";
else A.Task3(s);
}
return 0;
}