Pagini recente » Cod sursa (job #916275) | Cod sursa (job #66810) | Cod sursa (job #2131088) | Cod sursa (job #585474) | Cod sursa (job #538610)
Cod sursa(job #538610)
#include<stdio.h>
#include<string.h>
#define MOD 1000003
#define MAX 100005
#define MAXC 21
FILE *g = fopen("trie.out","w");
FILE *f = fopen("trie.in","r");
char C[MAX][MAXC], var[MAXC];
int H[MOD], V[MAX], N;
int put(int n, int p) {
int sol = 1;
while(p) {
if(p%2) {
sol*=n;
sol%=MOD;
}
n*=n; n%=MOD;
p/=2;
}
return sol;
}
void add(char sir[]) {
int cod, size=strlen(sir), i;
for(i=cod=0;i<size;++i) {
cod+=put(sir[i],i);
cod%=MOD;
}
if(H[cod])
++V[H[cod]];
else {
H[cod]=++N;
strcpy(C[N],sir);
V[N]=1;
}
}
void erase(char sir[]) {
int cod, size=strlen(sir), i;
for(i=cod=0; i<size; ++i) {
cod+=put(sir[i], i);
cod%=MOD;
}
if(V[H[cod]])
--V[H[cod]];
}
void tipar(char sir[]) {
int cod, size=strlen(sir), i;
for(i=cod=0; i<size; ++i) {
cod+=put(sir[i], i);
cod%=MOD;
}
fprintf(g,"%d\n", V[H[cod]]);
}
void prefix(char sir[]) {
int i, size=strlen(sir), j, max=-MOD;
char aux[MAXC];
strcpy(aux,var);
for(i=1; i<=N; ++i) {
strcpy(aux,sir);
if(V[i]>0 && strcmp(aux,C[i]))
for(j=size; j>=0 && j>max; --j) {
aux[j]=0;
if(strstr(C[i],aux)==C[i])
max=j;
}
}
fprintf(g,"%d\n",max);
}
int main() {
char sir[MAXC];
int var;
while(!feof(f)) {
var = -1;
fscanf(f,"%d ",&var);
fscanf(f,"%s", sir);
switch(var)
{
case 0:{add(sir);break;}
case 1:{erase(sir);break;}
case 2:{tipar(sir);break;}
case 3:{prefix(sir);break;}
default:break;
}
}
fclose(f);
fclose(g);
}