Pagini recente » Cod sursa (job #917501) | Cod sursa (job #2679592) | Cod sursa (job #3212183) | Cod sursa (job #1480057) | Cod sursa (job #681241)
Cod sursa(job #681241)
#include <fstream>
#include <string>
#include <stdlib.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
#define MarimeAlfabet 'z' - 'a'
#define pozitia(ch) ch - 'a'
typedef struct TRIE{
int nrCuvinteTerminate;
int nrCuvinteCuAcestPrefix;
struct TRIE* next[MarimeAlfabet];
TRIE(){
nrCuvinteCuAcestPrefix = nrCuvinteTerminate = 0;
for (int i=0; i<MarimeAlfabet; i++) next[i] = NULL;
}
}TRIE;
void insereaza(TRIE* T, string s)
{
unsigned int i;
TRIE *q, *p;
q = T;
for (i=0; i<s.length(); i++){
if (!q->next[pozitia(s[i])]){
p = new TRIE;
q->next[pozitia(s[i])] = p;
}
q = q->next[pozitia(s[i])];
q->nrCuvinteCuAcestPrefix++;
}
q->nrCuvinteTerminate++;
}
void sterge(TRIE* T, string s)
{
unsigned int i;
TRIE *q;
q = T;
for (i=0; i<s.length(); i++){
q = q->next[pozitia(s[i])];
q->nrCuvinteCuAcestPrefix--;
}
q->nrCuvinteTerminate--;
}
int NRaparitii(TRIE* T, string s)
{
unsigned int i;
TRIE *q;
q = T;
for (i=0; i<s.length(); i++){
q = q->next[pozitia(s[i])];
if (!q) return 0;
}
return q->nrCuvinteTerminate;
}
int CMLprefix(TRIE* T, string s)
{
unsigned int i;
TRIE *q;
q = T;
for (i=0; q && i<s.length() && q->next[pozitia(s[i])] && q->next[pozitia(s[i])]->nrCuvinteCuAcestPrefix; i++){
q = q->next[pozitia(s[i])];
}
return i;
}
int main()
{
TRIE *T;
T = new TRIE;
int c;
string s;
f >> c >> s;
while (!f.eof()){
if (c==0) insereaza(T,s); else
if (c==1) sterge(T,s); else
if (c==2) g << NRaparitii(T,s) << '\n'; else
if (c==3) g << CMLprefix(T,s) << '\n';
f >> c >> s;
}
return 0;
}