-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathinifinit pattern matching.cpp
70 lines (63 loc) · 1.34 KB
/
inifinit pattern matching.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
# include <fstream>
# include <algorithm>
# include <cstring>
# include <bitset>
# define inf 999999999
using namespace std;
ifstream f("infinitepatternmatching.in");
ofstream g("infinitepatternmatching.out");
int i,j,n,o,P,X,VV,ok;
int B[100], var[100];
long long nr,NR,Q;
char b[100];
bitset <15000005> p;
long long numara (int K) {
if (K==0) return 0;
else return (1<<(K-1));
}
long long pozitie (int nr) {
long long rez=0, VV=-1;
while (nr>0) {
var[++VV]=nr%2;
nr/=2;
}
for (int i=1; i<=VV; ++i)
rez=rez + numara(i)*i;
for (int i=VV; i>=0; --i) {
if (var[i]==1) rez=rez + numara(i)*(VV+1);
}
return rez+1;
}
int main ()
{
f.getline (b+1, 100); n=strlen(b+1);
for (i=1; i<=n; ++i) {
B[i]=(int)(b[i]-'0');
nr=nr*2 + B[i];
}
if (B[1]==0) Q=(1<<(n)), nr+=Q;
for (i=1; i<=(1<<19); ++i) {
X=i; VV=0;
while (X) {
var[++VV]=X%2;
X/=2;
}
for (j=VV; j>=1; --j)
p[++P]=var[j];
}
for (i=1; i<n; ++i)
NR=NR*2 + p[i];
for (i=n; i<=P; ++i) {
if (i==42) {
ok=0;
}
NR=NR*2 + p[i];
if (NR + Q==nr) {
g<<i<<"\n";
return 0;
}
NR=NR-(1<<(n-1))*p[i-n+1];
}
g<<pozitie (nr) +n-1;
return 0;
}