-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathcriptare2.cpp
81 lines (71 loc) · 1.66 KB
/
criptare2.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# include <fstream>
# include <algorithm>
# include <vector>
# include <cstring>
# define NR 20005
# define sigma 26
# define MOD 666013
using namespace std;
ifstream f("criptare2.in");
ofstream g("criptare2.out");
vector <int> H[MOD+1];
int i,j,n,m,x,y,l,cod,ok;
int mat[NR][sigma+2], nr[30];
char s[40];
void etalonare (char s[], int l) {
for (int i=1; i<=l; ++i)
s[i]=s[i]-'a'+1;
}
bool cmp (int x, int y) {
if (x<=y) return 0;
else return 1;
}
int make_code (int mat[]) {
int i,rez=1;
for (i=1; i<=sigma; ++i) {
if (mat[i]==0) break;
rez=(1LL*rez*mat[i])%MOD;
}
return rez;
}
bool egal (int nr[], int k) {
int i;
for (i=1; i<=sigma; ++i) {
if (mat[k][i]==0) break;
if (nr[i]!=mat[k][i]) return 0;
}
return 1;
}
int main ()
{
f>>n; f.get();
for (i=1; i<=n; ++i) {
f>>(s+1); f.get();
//face hash-ul
l=strlen(s+1); etalonare (s, l);
memset (nr, 0, sizeof(nr));
for (j=1; j<=l; ++j) // fiecare litera
nr[s[j]]+=(1<<j);
sort (nr+1, nr+sigma+1, cmp);
for (j=1; j<=sigma; ++j)
mat[i][j]=nr[j];
H[make_code (mat[i])].push_back(i);
}
//M
f>>m; f.get();
for (i=1; i<=m; ++i) {
f>>(s+1); f.get();
//face hash-ul
l=strlen(s+1); etalonare (s, l);
memset (nr, 0, sizeof(nr));
for (j=1; j<=l; ++j) // fiecare litera
nr[s[j]]+=(1<<j);
sort (nr+1, nr+sigma+1, cmp);
cod=make_code (nr);
ok=0;
for (j=0; j<H[cod].size() && !ok; ++j)
if (egal (nr, H[cod][j])) ok=1;
g<<ok<<"\n";
}
return 0;
}