You are on page 1of 73

CBook

-2013, C.python

1.1

. . . . . . . . . . . . . . . . . . . . . . . .

1.2

. . . . . . . . . . . . . . . . . . . . . . .

1.3

. . . . . . . . . . . . . . . . . . . . . . .

1.4

. . . . . . . . . . . . . . . . . . . . . . .

2.1

. . . . . . . . . . . . . . . . . . . . . . . .

3.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

3.3

12

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

4.1

. . . . . . . . . . . . . . . . . . . . . . . . . . .

13

4.2

. . . . . . . . . . . . . . . . . . . . . . . . . . .

15

4.3

. . . . . . . . . . . .

17

4.4

. . . . . . . . . . . . . . . . . . . . .

18

4.5

Python

19

. . . . . . . . . . . . . . . . . . . . .

19

5.1

5.2

. . . . . . . . .

19

. . . . . . . . . .

23

5.2.1

. . . . . . . . . . . . . . . . .

23

5.2.2

. . . . . . . . . . . . .

25

5.2.3

. . . . . . . . . . . . . . . .

5.3

. . . . . . . . . . .

5.4

5.5

26
27

. . . . . .

29

. . . . . . . . . . . . . . . . . . . .

31

5.5.1



. . . . . . . . . . . . . . . . . . . . .

31

5.5.2

  . . . . . . . . . . . . . . . . . .

32

5.5.3

. . . . . . . . .

34

35

6.1

. . . . . . . . . . . . . . . . . . . . .

35

6.2

k-

. . . . . . . . . . . .

37

6.3

. . . . . . . . . . . . . . . . . . . . .

38

8
9

39

7.1

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

7.2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

46

50

9.1

. . . . . . . . . . . . . . .

50

9.1.1

53

. . . . . . . . . . .

10

55

10.1 . . . . . . . . . . . . . . . . .

55

10.2

57

. . . . . . . . . . . .

10.3 . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

10.4 . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

10.5 . . . . . . . . . . . . . . . . . . . . . . . . .

66

10.6 -

. . . . . . . . . . . . . . . . . . . .

69

10.7 . . . . . . . . . . . . . . . . . . . . . . . . . .

71

1.1


(). 
A, (, , , . .). ,

A[i] A[i + 1] .
[4, 1, 2, 4, 2, 3],
[1, 2, 2, 3, 4, 4]. -

(  ).

A[i] A[i + 1],

(-

). .
 . . 0 ( ).
1. ,
, c 2 . .
, .

i 0.
A[: i]) ,

A[i :]
i.

def S e l e c t i o n S o r t (A ) :
f o r i in r a n g e ( 0 ,

l e n (A)

A[ i : ]

1):

min_idx =

for

min_idx

in r a n g e ( i + 1 , l e n (A ) ) :
i f A [ j ] < A [ min_idx ] :

min_idx = j

A[ i ] ,

A [ min_idx ]

A[ min_idx ]

= A [ min_idx ] ,

A[ i ]

A[ i ]

 ,

A[j]

A[i],

A[i :]

A[j] < A[i]:

def S e l e c t i o n S o r t (A ) :
f o r i in r a n g e ( 0 , l e n (A) 1 ) :
f o r j in r a n g e ( i + 1 , l e n (A ) ) :
i f A[ j ] < A[ i ] :
A[ i ] ,

A[ j ]

= A[ j ] ,

A[ i ]

, -

n . n .
n 1 , n 1 -

. n 2 . .
= O(n2 ). ,
n + (n 1) + (n 2) + ... + 1 = n(n+1)
2
 ,
.

1.2

:
,

i-

A[: i]

. -

. -

A[i] . ,
i = 5 A[: i] = [1, 4, 6, 8, 8], A[i] = 5.
A[i] = 5 A[1] = 4, ,
5 1. c A[: i+1] = [1, 4, 5, 6, 8, 8]. , A[i] A[: i] ,
, , A[i]

A[i].

, ..

A[i],

A[i]

def I n s e r t i o n S o r t (A ) :
f o r i in r a n g e ( 1 ,

#
#
#

new_elem

l e n (A ) ) :

new_elem = A [ i ]

j =

A[ i

A[ i ]

1]

new_elem

while j >= 0 and A [ j ] > new_elem :

A[i 1].

A[ j + 1 ] = A[ j ]

A [ j + 1 ] = new_elem

new_elem

. , ,
.  , ..

O(n). ,

 , ,
.
, , , , , . . . -

n(n+1)
= O(n2 ).
2
, , -

1+2+. . .+(n1)+n =

,   .
 ,  .
 , ?
( ,
),

n(n+1)
= O(n2 ).
4
.

1.3

.
, ,

A[i] > A[i + 1].

. ,

, 
, . , .
.
 .   .  
, .
. . ,

. :

def B u b b l e S o r t (A ) :
f o r j in r a n g e ( l e n (A) 1 , 0 ,
f o r i in r a n g e ( 0 , j ) :
i f A[ i ] > A[ i + 1 ] :
A[ i ] ,

A[ i

1):

+ 1 ] = A[ i

+ 1] ,

A[ i ]

O(n2 ).

,
? ,

O(n2 )

, , .
 ,

IsNotOrdered, True, .
IsNotOrdered = False ( -

, ), -

IsNotOrdered = True.
IsNotOrdered

,
,

True.

def B u b b l e S o r t (A ) :
j = l e n (A)

I s N o t O r d e r e d = True

while I s N o t O r d e r e d :
IsNotOrdered = False

for

in r a n g e ( 0 , j ) :
i f A[ i ] > A[ i + 1 ] :

A[ i ] ,

A[ i

+ 1 ] = A[ i

+ 1] ,

A[ i ]

I s N o t O r d e r e d = True
j

(
). , . , , .
, , ,
, .

1.4

, , , , . ,
, , ,
, oat. ,  .

K . 0, 1, 2, . . . , K 1

,
,

A. Count K (
0 K - 1), Count[i] i
A. elem 1 A[elem]. .
0 , Count[0],
1 Count[1] . .

. K ,
, 1.

def C o u n t S o r t (A ) :
K = max (A) + 1
Count =

[0]

f o r e l e m in A :
Count [ e l e m ] += 1
Result =

for

val

[]

in r a n g e (K ) :

R e s u l t += [ v a l ]

Count [ v a l ]

return R e s u l t
, , , ,
.
 ,
. , :

,

O(n + K).

n, -

, ,
100,

106

 -

2.1

, , .
. , , ( ) .
( , ), . (
) .
, ,
i j, .
.

A[i:] + B[j:] ( , ).

def merge (A, B ) :


Res =
i

[]

= 0

j = 0

while i < l e n (A) and j < l e n (B ) :


i f A [ i ] <= B [ j ] :
Res . append (A [ i ] )

i += 1

else :
Res . append (B [ j ] )
j += 1
Res += A [ i : ]

+ B[ j : ]

return Res
, merge  A B,
O(1).
. 
, , , . 1 0, .
1, (
, ). ,
merge.

def M e r g e S o r t (A ) :
i f l e n (A) <= 1 :
return A
else :
L = A [ : l e n (A)
R = A [ l e n (A)

//
//

2]
2:]

return merge ( M e r g e S o r t ( L ) , M e r g e S o r t (R ) )
.
.

O(n)

n/2,
n/4

O(n)

. ,

O(n)

n/8

n/4

.   ,

n 2, , 1,
log2 n. , O(n log2 n).

,
( , ) .

3.1

(.

stack

) ,

,
 .
, ,
, .
LIFO (last in, rst out  -

, ).
:

push  .
pop  . , . , pop
.

top  (
).

size  .
top ( pop push), size
isempty . clear,

.
Python
,

append
append. .

Stack, .

def p u s h ( S t a c k ,

data ) :

S t a c k . append ( d a t a )

def pop ( S t a c k ) :
return S t a c k . pop ( )
def t o p ( S t a c k ) :
return S t a c k [ 1 ]
def

s i z e ( Stack ) :

return l e n ( S t a c k )
def i s e m p t y ( S t a c k ) :
return l e n ( S t a c k ) == 0
def

c l e a r ( Stack ) :
Stack [ : ]

[]

, , :
Stack =

[]

push ( Stack ,

1)

push ( Stack ,

2)

push ( Stack ,

3)

while s i z e ( S t a c k ) > 0 :
print ( pop ( S t a c k ) )
, () , ,
, ,

stacksize. stacksize 1,  1.
, , :

def p u s h ( d a t a ) :
stacksize

stacksize

Stack [ s t a c k s i z e ]

+ 1

= data

def pop ( ) :
data = Stack [ s t a c k s i z e ]
stacksize

stacksize

return d a t a
Python ,

, . ,

O(1).
-

Stack,
push, pop, top .. __elems,
.

push, pop ..

class Stack :
def __init__ ( s e l f ) :
s e l f . __elems =

def p u s h ( s e l f ,

[]

data ) :

s e l f . __elems . append ( d a t a )

def pop ( s e l f ) :
return s e l f . __elems . pop ( )
def t o p ( s e l f ) :
return s e l f . __elems [ 1 ]
def

size ( self ):

return l e n ( s e l f . __elems )
def i s e m p t y ( s e l f ) :
return l e n ( s e l f . __elems ) == 0
def

clear ( self ):
s e l f . __elems [ : ]

[]

-:
S = Stack ( )
S . push ( 1 )
S . push ( 2 )
S . push ( 3 )

while S . s i z e ( ) > 0 :
print ( S . pop ( ) )

. -,
. , , , ,
, .

3.2

(.

queue

) , -

, .
 ,
, .
FIFO (rst in, rst out 
, ). , ,
,

pop top

.
, ,
, ,

pop

0. :

c l a s s Queue :
def __init__ ( s e l f ) :
s e l f . __elems =

def p u s h ( s e l f ,

[]

data ) :

s e l f . __elems . append ( d a t a )

def pop ( s e l f ) :
return s e l f . __elems . pop ( 0 )
def t o p ( s e l f ) :
return s e l f . __elems [ 0 ]
, .
,
, , (

O(n),

 ).

pop

, , ,
. ( )

__queuestart

, .
1, , -
, .

c l a s s Queue :
def __init__ ( s e l f ) :
s e l f . __elems =

[]

10

s e l f . __queuestart = 0

def p u s h ( s e l f ,

data ) :

s e l f . __elems . append ( d a t a )

def t o p ( s e l f ) :
return s e l f . __elems [ s e l f . _ _ q u e u e s t a r t ]
def pop ( s e l f ) :
s e l f . _ _ q u e u e s t a r t += 1

return

s e l f . __elems [ s e l f . _ _ q u e u e s t a r t

1]

size 

c l a s s Queue :
def s i z e ( s e l f ) :
return l e n ( s e l f . __elems )

s e l f . __queuestart


 , .
,
, .
.
, ,
. , 
, .

. (
).
, .
, .
,
 ,
.
 .
, ,
, ,

O(1).

, 
, .
, .

pop:

c l a s s Queue :
def pop ( s e l f ) :
result

s e l f . __elems [ s e l f . _ _ q u e u e s t a r t ]

s e l f . _ _ q u e u e s t a r t += 1

11

if

s e l f . __queuestart >

l e n ( s e l f . __elems )

s e l f . __elems [ : s e l f . _ _ q u e u e s t a r t ]

2:

[]

s e l f . __queuestart = 0

return r e s u l t
.

O(1),

O(n).

(.

deque

, (

3.3

O(n),

O(1).

double-ended queue  ) -

,
.

.

,

O(n).

collections Python deque,

,
. :

append(x)  x ( ).
appendleft(x)  x ( ).
pop()  ( ) . .

popleft()  ( ) . .

clear()  .
rotate(n) 
,
.

n-

n < 0,

|n|

deque

len, ,
D deque, D[0]
() , D[1]  , .. D[-1]
() , D[-2] 

.. :

import c o l l e c t i o n s
D =

c o l l e c t i o n s . deque ( )

D. a p p e n d l e f t ( 1 )
D. a p p e n d l e f t ( 2 )
D. a p p e n d r i g h t ( 3 )

#
#

[2 , 1 , 3]

while l e n (D) > 0 :


print (D [ 0 ] )

12

D. p o p l e f t ( )
,

O(1),

O(n).

4.1

. , ,

A key. True
False. , key.
, , for

key :
def s e a r c h (A, k e y ) :
f o r i in r a n g e ( l e n (A ) ) :
i f A [ i ] == k e y :
return True
return F a l s e
Python (for
elem in A), c (for i in range(len(A)).
:

def s e a r c h (A, k e y ) :
f o r e l e m in A :
i f e l e m == k e y :
return True
return F a l s e
while
. , ,

key

. i
, i=0. i , i ,
,

key.

A[i] == key, i , i==len(A).


, ,

i < len(A).

def s e a r c h (A,
i

key ) :

= 0

while i < l e n (A) and A [ i ] != k e y :


i += 1

return i < l e n (A)

13

key, -

, ,

key, ,

1.

for:

def s e a r c h (A, k e y ) :
f o r i in r a n g e ( l e n (A ) ) :
i f A [ i ] == k e y :
return i
return 1
while:

def s e a r c h (A,
i

key ) :

= 0

while i < l e n (A) and A [ i ] != k e y :


i += 1

if

i <

l e n (A ) :

return i
else :
return

(
)
,
,

O(n) (n  ).

key -

,
:

def s e a r c h (A,
i

key ) :

= 0

while A [ i ] != k e y :
i += 1

return i
key , key ,
( key
,

) .
.

.
. ,
, .

def s e a r c h (A,

key ) :

A . append ( l e y )
i

= 0

while A [ i ] != k e y :
i += 1
A . pop ( )

return i < l e n (A)

14

4.2

,
, .
,
,
. ,
, , , ,

O(log2 n)

( ,

).
,  ,

key

. ,

key. ,  left
right. , A[right] ,
key, ,
right. A[left] ,

, key. ,

A[left] A[right] ( ,
left, right), . left right ,

.
,
, , ,
, .
, -

left right : left


right
, right. left

, 0,

= -1 right = len(A).  , ,
(. . , , key), -1, , , len(A).
, left right
.
left right . middle = (left + right) // 2.
key. A[middle]
key , A[middle] ,
, . ,
right = middle. ( A[middle] <= key),
A[middle] , , ,
left = middle. ,
left right , right >
left + 1. 
.
left

r i g h t = l e n (A)

while r i g h t > l e f t + 1 :

15

middle = ( l e f t

+ right )

//

i f A[ middle ] > key :


r i g h t = middle

else :
left

= middle

? left right
, A[right] > key, A[left] <= key. , key , A[left] == key,
, A[left] < key. , left == -1 (
A key, right left
== -1 right == 0).
A key left >= 0 and A[left] == key.
, :

def B i n a r y S e a r c h (A,
left

key ) :

r i g h t = l e n (A)

while r i g h t > l e f t + 1 :
middle = ( l e f t

+ right )

//

i f A[ middle ] > key :


r i g h t = middle

else :
left

return

= middle

l e f t >= 0

and A [ l e f t ] == k e y

,
.
right ? , , key. , A[right]
key (
, key, ),
, right ,
key, .
, right   key: key,
. , A key:

def UpperBound (A,


left

key ) :

r i g h t = l e n (A)

while r i g h t > l e f t + 1 :
middle = ( l e f t

+ right )

//

i f A[ middle ] > key :


r i g h t = middle

else :
left

= middle

return r i g h t
, ,

16

key, , ,
. :

def LowerBound (A,


left

key ) :

r i g h t = l e n (A)

while r i g h t > l e f t + 1 :
middle = ( l e f t

+ right )

//

i f A [ m i d d l e ] >= k e y :
r i g h t = middle

else :
left

= middle

return r i g h t
left right ? A[left] < key,
A[right] >= key. right ,
( ) key, , right , key. , key,
right, , , . ,   key. ,
UpperBound ,
key, LowerBound , key (  , , key),
UpperBound(A, key) - LowerBound(A, key)
key A.
LowerBound
key A right < len(A) and A[right] == key
(, ,
right , key,
, ,
key, LowerBound
left == len(A) - 1, right == len(A)).

4.3

f (x), [a, b], ,

f (a) < 0, f (b) > 0, , [a, b] .

,
,

f (a) < 0, f (b) > 0,

[a, b],

. ,
,
.
EPS.

def r o o t ( a , b ) :
while b a > EPS :

17

x = ( right +

if

f (x) >

left )

0:

b = x

else

:
a = x

return ( a + b ) / 2

4.4

, , ,
,
, . .

, a ,  b . n ,
?
. , -

,
:
1. , (  ).
2. 
, () (

).
3. () ,
.
4. (, ) , .
. ,

, ,

. ,

t // a + t // b >= n.

t,

, ,

:
t = 0

while t / / a + t // b < n :
t += 1
,

t,

t // a + t // b >=

n .

18

left right. left ,


. right ,
, , . left
right () .
left right. t = (left + right) // 2. ,
t.

n,

right = t ( t , ),
left = t ( t , ). , right left
. , right == left + 1, right
,

n ,

right - 1 .
left -1 ( -1
), right ,

left

, ,

an.
1

right = a

while r i g h t > l e f t + 1 :
t = ( left

if

//

+ right )

a + t

//

//

b >= n :

right = t

else :
left

= t

print ( r i g h t )
, left 0,

n = 0

0,

0 0 , left t,
, left
-1.

4.5

Python

Python .

in not in, . , 2 in [1, 2, 3]


True, 2 not in [1, 2, 3] False.
index.

5
5.1

. , .

19

0. -

n.

n,

F (n).
F (0) = 1

F (n).

( ,

0 0  ),

F (1) = 1, F (2) = 2.

n1

F (n)? n
n 2

1.

n 1 n 2,
F (n) = F (n 2) + F (n 1),

n 2.

def F ( n ) :
if n < 2:
return 1
else :
return F ( n

1 ) + F( n

2)

n,

n = 40,

, .
, , , .
,

F (n 1)

F (n) F (n1) F (n2).


F (n 2) F (n 3).

F (n 2)  F (n 1)  F (n 2). F (n 3)
, F (n 4)
.  .
 ,
.
,
, .
, 
, .
F =

[0]

F[0]
F[1]

for

(n + 1)

= 1
= 1
i

in r a n g e ( 2 , n + 1 ) :

F[ i ]

= F[ i

2] + F[ i

1]

O(n).

20

F (i)

F (i + 1)

F (i + 2).

. ,
, .
,
 ,
, .
. ,
, -

n. : F (n) =
F (n 1) + F (n 2) + F (n 3). : F (0), F (1), F (2).

:
F =

[0]

(n + 1)

F[0]

= 1

F[1]

= F[0]

F[2]

for

= F[1]
i

+ F[0]

in r a n g e ( 3 , n + 1 ) :

F[ i ]

= F[ i

3] + F[ i

2] + F[ i

1]

.  , .  Map: Map[i] == 0,
i , Map[i] == 1,
. ,

n.


: Map[i] == 0, F[i] = 0, , 0,
, .
Map[i] == 1, F[i] , . :
F =

[0]

F[0]

for

(n + 1)

= 1

in r a n g e ( 1 , n + 1 ) :
i f Map [ i ] == 0 :

F[ i ]

= 0

else :
F[ i ]

= sum ( F [ max ( 0 ,

3):

i ])

F[i - 3] +
F[i - 2] + F[i - 1] , F[1] F[2]
, .
.
,
, . i
Price[i] Price.
0

21

n.

n. C(n). n n 1 n 2.
C(n 1) C(n 2) ,
Price[n] n. n1 n2 -

C(n)

- 0

, .
:

C(n) = min(C(n 1), C(n 2)) + P rice(n).

, :
C =

for

[0]

C[ 1 ]

(n + 1)

= Price [ 1 ]

in r a n g e ( 2 , n + 1 ) :

[ i ]

= min (C [ i

1] ,

C[ i

2])

+ Price [ i ]

n.

, ,
.
 .

Prev[i], i, . Prev[i]  ,
i (
, Prev  ). Prev[i]?

C[i 1] < C[i 2],

i i -1,

Prev[i] = i - 1, Prev[i] = i - 2.
, Prev[i].
C =

[0]

C[ 1 ]

Prev [ 1 ]

for

(n + 1)

= Price [ 1 ]
i

= 0

in r a n g e ( 2 , n + 1 ) :

i f C[ i  1 ] < C[ i  2 ] :
C[ i ]

= C[ i

Prev [ i ]


i

1] + Price [ i ]

 1

else :
C[ i ]

= C[ i

Prev [ i ]


i

2] + Price [ i ]

 2

n ,
0.
Path.
Path =
i

[]

= n

while i > 0 :
Path . append ( i )
i

= Prev [ i ]

Path . append ( 0 )
Path = Path [ : :

1]
22

Path 0,
, Path (. . ,
).
Prev. , i, C[i-1]
C[i-2]. , ,
C[i-1] C[i-2]. ,
C .
Path =
i

[]

= n

while i > 0 :
i f C[ i  1 ] < C[ i  2 ] :
prev =

 1

else :
prev =

Path . append ( p r e v )
i

= prev

Path . append ( 0 )
Path = Path [ : :

5.2

1]

 , .

5.2.1

. ,
- .
, .

,

(i, j),

 .

,  , 0.

(0, 0).
F (i, j) (0, 0)
(i, j). (i, j) 
(i, j 1), (i 1, j) (i 1, j 1).

, :

F (i, j) = F (i, j 1) + F (i 1, j) + F (i 1, j 1)
,

i=0

j = 0.

23

1
9

13

25

41

25

63

129

41

129

321

,
, ( ), .
,

m for i
in r a n g e ( n ) :

F =

[[0]

for

F[ i ] [ 0 ]

for

in r a n g e ( n ) ]

= 1

in r a n g e (m) :

F[0][ j ]

for

 .

= 1

in r a n g e ( 1 , n ) :
f o r j in r a n g e ( 1 , m) :
i

F[ i ] [ j ]

= F[ i ] [ j

1] + F[ i

1][ j ]

+ F[ i

1][ j


. :
1. , ,
(, ).
2. (
, ). , ,
.
3. , ,
.
4. ( ) . , , ,
- . .
5. ,
2 .
 , .
,  . 

24

1]

 .
,
, 0,

(0, 0),

1:

13

25

41

25

63

129

41

129

321

F (i, j) = F (i, j 1) + F (i 1, j) + F (i 1, j 1),

:
F =

[[0]

F[0][0]

for

(m + 1 )

for

in r a n g e ( n + 1 ) ]

= 1

i in r a n g e ( 1 , n + 1 ) :
f o r j in r a n g e ( 1 , m + 1 ) :
F[ i ] [ j ]

5.2.2

= F[ i ] [ j

1] + F[ i

1][ j ]

+ F[ i

1][ j


, . , ,

(1, 1),

(n, m),

.
,

P rice[i, j],

(i, j)

(i, j)

(1, 1)

(i, j)

C(i, j) = min(C(i, j 1), C(i 1, j), C(i 1, j 1)) + P rice[i, j]


( )
( ). ,
,

.
INF, INF , ,
,
 0:
INF = 10
C =

[[0]

C[ 0 ] [ 0 ]

for

2 0
(m +

for

in r a n g e ( n + 1 ) ]

= 0

in r a n g e ( 1 , n + 1 ) :

C[ i ] [ 0 ]

for

1)

C[0][0] = 0.

= INF

in r a n g e ( 1 , m + 1 ) :

25

C.

1]

C[ 0 ] [ j ]

for

= INF

in r a n g e ( 1 , n + 1 ) :
f o r j in r a n g e ( 1 , m + 1 ) :
i

C[ i ] [ j ]

= min (C [ i ] [ j
C[ i

1] ,

1][ j

C[ i

1])

1][ j ] ,

+ Price [ i ] [ j ] )

. , ,
,

Answer =
i

.
[]

= n

j = m

while ( i ,

j)

!=

(0 ,

0):

Answer . append ( ( i ,

j ))

prev_C = min (C [ i ] [ j

i f C[ i ] [ j
i ,

1] ,

C[ i

1][ j ] ,

C[ i

1][ j

1])

1 ] == prev_C :

j = i ,

e l i f C[ i
i ,

1 ] [ j ] == prev_C :

j =

1,

j =

1,
1]

else :
i ,

Answer = Answer [ : :

5.2.3

  .

nm

-. ,
,
, -. ,
 , , ,
. ,
.
. + -. + , (
, , ,
), - ,  .
, , , +,
, :
+

+
+

+
+

+
+

+
+

- 
, , , .

26

,
, +.
-  ,
, , +, . , ,  .
+

+
+

+
+

+
+

, ,
- , + 
, , , ,
, -.
. +,
, , -.
-, ,
+. .

5.3

( )

b0 ...bm1 .

a0 ...an1 ,

B.

(-

) ,
, ,

n , 2n
n -

.
:

, .

.
 , .
, A='abcabaac', B='baccbca' A B
4, , 'acba' 'acbc'.
 ,

2n

, .

O(nm).

27

an1

bm1 .

,
.

A = a0 ...an1

B = b0 ...bm1

,
,

a0 ...an2

b0 ...bm2 .

 ()
(an1

bm1 )

, (an1

bm1 ) -

, .
-

a0 ...an2 b0 ...bm1 a0 ...an1

b0 ...bm2 .
-

- , , .

.

i : A0 = a0 ...ai1
B j : B = b0 ...bj1 .
0
0
, A = A[: i] B = B[: j].
F (i, j) A0 B 0 .

A0

. ,

bj1 ,

F (i, j) = F (i 1, j 1) + 1

A0

B 0 . ai1 =

- ,


1 .
:

F (i 1, j) F (i, j 1), -

F (i, j) = max(F (i 1, j), (i, j 1)).


F

: 

, ,
0:

F (0, j) = F (i, 0) = 0.

(n + 1) (m + 1)

.
( ),

:
n = l e n (A)
m = l e n (B)
F =

for

(m + 1 ) f o r i in r a n g e ( n + 1 ) ]
in r a n g e ( 1 , n + 1 ) :
f o r j in r a n g e ( 1 , m + 1 ) :
i f A [ i 1 ] == B [ j 1 ] :
[[0]

F[ i ] [ j ]

= F[ i

1][ j

1] + 1

else :
F[ i ] [ j ]

= max ( F [ i

28

1][ j ] ,

F[ i ] [ j

1])

print ( F [ n ] [ m] )
'abcabaac'
'baccbca'.
4.

F F [i][j] ,

.  
.

ai1 = bj1 ,
F [i][j] F [i1][j 1] 1,
F [i 1][j 1], ai1 = bj1 .
F [i 1][j] F [i][j 1],
F [i][j]. :
.

Ans =
i

[]

= n

j = m

while i > 0 and j > 0 :


i f A [ i 1 ] == B [ j
Ans . append (A [ i
i
j

=
=

e l i f F[ i
i

1]:
1])

1
1

1 ] [ j ] == F [ i ] [ j ] :

else :
j

= 1
1]

Ans = Ans [ : :

5.4

a0 ...an1 .

.
.
 , (

29

b0 , . . . , bm1 .

. , -

A,

O(n2 ).

F (i)

ai .

F (i)

aj ,

j<i

aj < ai .

aj

F (i),

. ,

F (i) = 1 +

min

j<i,aj <ai

aj ai

F (j).

j,

F (j)

j < i),

F (i) = 1.

F =

[0]

for

in r a n g e ( l e n (A ) ) :
f o r j in r a n g e ( i ) :
i f A [ j ] < A [ i ] and F [ j ] > F [ i ] :

l e n (A)

F[ i ]

= F[ j ]

F [ i ] += 1
( )

F (i).

ai , F (i) .
. .

aj ,

j<i

F (j) = F (i) 1.

j,

F (j) =,

.
,

O(n2 ).

,
:

F (i)

O(n log n).

- -

,
i.

i i ,

.
:

+ inf ,

F (0) = inf ,

F (n + 1) =
n + 1

, ,
( ).

 ,
.
, .
:

F (0) = inf , F (i) = + inf

i > 0,

, 1.

30

ai .

, ,

ai . k ,
x, F (k) = x,
x < ai , k +1
, ai ,
k . F (k + 1),
F (k + 1) , ai . , F k , F (k) < ai , F (k + 1) ai ,
F (k + 1) = ai .
,

LowerBound,

, ,

ai .

ai ,
F

, .
:
INF = 10
F =

[ INF ]

F[0]

for

=
i

10
( l e n (A) + 1 )

INF

in r a n g e ( l e n (A ) ) :

left

= 0

r i g h t = l e n (A)

while r i g h t

left

middle = ( l e f t

>

1:

+ right )

//

i f F [ m i d d l e ] >= A [ i ] :
r i g h t = middle

else :
left
F[ right ]

= middle

= A[ i ]

( )

i,

F (i) 6= + inf .

. , ,

i
i -

5.5
5.5.1




a1 , a2 , . . . , an . K

. ,
( - , ).
   , ,

31

, . ,

a1 = 1, a2 = 20, a3 = 90,

K = 100.

 90 10 1,
, 50.
.

F (k)

 -

. , -

ai .
k ai , F (k ai ) . F (k) =
1 + F (k ai ). i: F (k) = 1 + mini F (k ai ).
: F (0) = 0, F (k) = +
k < 0. + -

,  , .

k ,
k ai 0.

i,

F (k)



,
e A 0.
INF = 10
F =

[ INF ]

F[0]

= 0

10
(K + 1 )

f o r k in r a n g e ( 1 , K + 1 ) :
f o r i in r a n g e ( l e n (A ) ) :
i f k A [ i ] >= 0 and F [ k
F[ k ]

= F[ k

A[ i ] ]

< F[ k ] :

A[ i ] ]

F [ k ] += 1
,

k,

ai ,

F (k) = F (k ai ) + 1.

,
, Ans.
Ans =

[]

k = K

while k != 0 :
f o r i in r a n g e ( l e n (A ) ) :
i f k A [ i ] >= 0 and F [ k ] == F [ k

A[ i ] ]

+ 1:

Ans . append (A [ i ] )
k

5.5.2

A[ i ]

 



,

F (k) < +.

. , ( ),

32

.
:

a1 , a2 ,

...,

an .

n -

( 

K ).

k,

F (k)

 ,

True ( 1) False ( 0).

F (k).
ai F (k) = 1, F (kai ) =
1, k ,
k ai .
,

F =

[0]

F[0]

(K + 1 )

= 1

for

in r a n g e ( l e n (A ) ) :

F_new = F [ : ]

f o r k in r a n g e (A [ i ] , K + 1 ) :
i f F [ k A [ i ] ] == 1 :
F_new [ k ]

= 1

F = F_new
.
0,

F (0) = 1,

,
, .

ai ,

k k ai ,

ai .

F,

F (ai ), F (2ai ), F (ai ) = 1, F (3ai )

.. ,

ai .

.
F =

for

[0]

F[0]

(K + 1 )

= 1
i in r a n g e ( l e n (A ) ) :
f o r k in r a n g e (K, A [ i ] 1 ,
i f F [ k A [ i ] ] == 1 :
F[ k ]

1):

= 1

, ,

P rev .
F =
F[0]

[0]

P rev

(K + 1 )

= 1

Prev =

[0]

(K + 1 )

33

F (k) = 1:

for

i in r a n g e ( l e n (A ) ) :
f o r k in r a n g e (K, A [ i ] 1 ,
i f F [ k A [ i ] ] == 1 :
F[ k ]

1):

= 1

Prev [ k ]

= A[ i ]



Ans =

k P rev(k)

k = 0.

[]

k = K

while k > 0 :
Ans . append ( P r e v [ k ] )
k

5.5.3

Prev [ k ]


. ,

wi > 0 (pi > 0. -

:
)

K.

2n

, .

O(2n ).

(  ),

O(nK)

k ,
(0 1),
,
, .
:

F (i, k)

- -

k,

F (i, k)

F (i, k) = F (i 1, k),
i1

F (i, k) = F (i 1, k).
i

k wi ,
i 1 ,
F (i 1, k wi ).
i , pi .
F (i, k) = F (i 1, k wi ) + pi .

k wi ),

i.

i,

34

F (i, k) = max(F (i 1, k), F (i 1, k wi ) + pi ).


F W , 

P.

( ),

1
F =

for

n.

[ 0 ] (K + 1 ) f o r i in r a n g e ( n + 1 ) ]
in r a n g e ( 1 , n + 1 ) :
f o r k in r a n g e ( 1 , K + 1 ) :
i f k >= W[ i ] :
[

F[ i ] [ k ]

= max ( F [ i

1][k] ,

F[ i

1][k

W[ i ] ]

else :
F[ i ] [ k ]

= F[ i

1][k]

 

1.

i ,
F (i, k). F (i, k) = F (i 1, k), i
i 1 k . i
, k wi .
.

k = K

for

in r a n g e ( n , 0 ,
i f F [ i ] [ k ] != F [ i

1):
1][k ]:

Ans . append ( i )
k

= W[

i ]

F (i, k) = F (i 1, k) F (i, k) 6= F (i 1, k).

Ans ,
.


. ,
, , , . .

6.1

n a0 , a1 , . . . , an1 .
n-

2n . , 3
{1, 2, 3} : {} ( ), {1}, {2}, {3}, {1, 2},
{1, 3}, {2, 3}, {1, 2, 3}.
n , i-
0, ai ,
1, ai .

35

+ P[ i ] )

, , .
, (.

n.
n = 3 :

. 0 1)
,

000
001
010
011
100
101
110
111
, .. ,
0, , 1. , , , 
. .

n=3

. 0,

n1

, 1

n1

, - (, 0),
0 ( 00)

n2

, 1

( 01),

n2

generate . -

.  prex,
. prex, 0, 1,

n 1 .
n = 0,

,
prex.
, - ,
print .

n1

 prex 0,

1. :

def g e n e r a t e ( n , p r e f i x ) :
i f n == 0 :
print ( p r e f i x )

36

else :

generate (n
generate (n

1,

prefix

+ "0" )

1,

prefix

+ "1" )

, 5,
: generate(5, )
. ,
, 1 . , 1 , prex 0, .
:

def g e n e r a t e ( n , p r e f i x ) :
i f n == 0 :
print ( p r e f i x )
else :

generate (n

if

1,

p r e f i x == " "
generate (n

6.2

prefix

+ "0" )

or p r e f i x [ 1 ] == " 0 " :

1,

prefix

+ "1" )

k-

. (k -

n-

) .


generate,


k,

. prex 0,
(n1,

n1

k ), k , ..

. prex 1,
(n

1, k 1).

, , . , 1
,
,

k < n,

k > 0. 0 k = n

def g e n e r a t e ( n , k , p r e f i x ) :
i f n == 0 :
print ( p r e f i x )
else :
if k < n:
generate (n

1,

k,

1,

prefix

+ "0" )

if k > 0:
generate (n

1,

prefix

+ "1" )

 .

n. k 1 n.

 1

37

, ,

n=4
{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4}.

. ,

k=2

6 :

, -

n.

def g e n e r a t e ( n , k , p r e f i x ) :
i f k == 0 :
print ( p r e f i x )
else :
i f l e n ( p r e f i x ) == 0 :
next = 1

else :
next =

p r e f i x [ 1] + 1

while n e x t + k

generate (n ,

1 <= n :

1,

prefix

[ next ] )

n e x t += 1
prex  , generate
.
,

n  -

, prex.

k = 0, prex -

. ,
prex. next. next 1
prex, prex , next 1.
next 1, next

n k + 1,

prex. next
. . next

6.3

k1

, next,

n.

1
, 1

n,

. ,

n!,

,
.
,

(-

) prex  .
1

n -

. prex,
prex
.
, prex

n,

prex.

38

def g e n e r a t e ( n , p r e f i x ) :
i f l e n ( p r e f i x ) == n :
print ( p r e f i x )
else :
f o r n e x t in r a n g e ( 1 , n + 1 ) :
i f n e x t not in p r e f i x :
generate (n ,

prefix

[ next ] )

n- ,
k - , , -

, . , : ,
, , .

7.1

n-
n

. 

,
0

2 2 2 = 2n .

n1.

0 1, , i-

1, i- 0
.

0 1.
:

def g e n e r a t e ( n , p r e f i x ) :
i f n == 0 :
print ( p r e f i x )
else :
generate (n
generate (n

1,

prefix

+ "0" )

1,

prefix

+ "1" )

, , ,
0

2n 1.

2n 1.

bin, , bin 

0b, bin

for

in r a n g e ( 2

n:

n):

39

S = bin ( i ) [ 2 : ]
S = "0"

(n

len (S)) + S

print ( S )

,

, :

010

0002

110

0012

210

0102

310

0112

410

1002

510

1012

610

1102

710

1112

,
bin (
),
, ,
.
int, 2 
.
 . ,
'101' '110',  '100'. 1, 
1.
, :

def N e x t B i n a r y S e q u e n c e ( S ) :
n = len (S)

i f S == ' 1 ' n :
return None
else :
S = bin ( i n t (S ,

return

'0 '

(n

2) +

1)[2:]

len (S)) + S


. , ,
None.
:

40

def P r e v B i n a r y S e q u e n c e ( S ) :
n = len (S)

i f S == ' 0 ' n :
return None
else :
S = bin ( i n t (S ,

return

'0 '

(n

2)

1)[2:]

len (S)) + S


.
:
1. ( )
, .
2. .
3. , , , .
-
 0 1. ,
, 0. ,
. , 1,
, 0.

def N e x t B i n a r y S e q u e n c e ( S ) :
n = len (S)
i

= n

while i > 0 and S [ i ] == " 1 " :


i

if

i <

0:

return None
else :
return S [ : i ] + " 1 " + " 0 "

(n

1)

: , 1,
0,
, 1.

def P r e v B i n a r y S e q u e n c e ( S ) :
n = len (S)
i

= n

while i > 0 and S [ i ] == " 0 " :


i

if

i <

0:

return None
else :
return S [ : i ] + " 0 " + " 1 "

41

(n

1)

( )
: ,
:
S = "0"

while S :
print ( S )
S = NextBinarySequence ( S )

7.2

n. , n
n!: n ,
n 1 ..

def g e n e r a t e ( n , p r e f i x ) :
i f l e n ( p r e f i x ) == n :
print ( p r e f i x )
else :
f o r n e x t in r a n g e ( 1 , n + 1 ) :
i f n e x t not in p r e f i x :
generate (n ,

prefix

[ next ] )

. , ,
(n

= 9).

(2, 9, 6, 5, 8, 7, 4, 3, 1)

, ,
, .
5,

(8, 7, 4, 3, 1)

,
. ,
5 , .
5 7,
, 5, ,
5, , 7.
5 7 ,

(2, 9, 6, 7, 8, 5, 4, 3, 1).

, 7, , .
, 5 7 ,
, ,
.
NextPermutation. ,

42

def N e x t P e r m u t a t i o n (P ) :
i

= l e n (P)

while i >= 0 and P [ i ] > P [ i + 1 ] :


i

if

i <

0:

P[:]

[]

return

j = l e n (P)

while P [ j ] < P [ i ] :
j
P[ i ] ,
P[ i

P[ j ]

= P[ j ] ,

P[ i ]

= P [ : i : 1]

1:]

P[i],
, P[i + 1]. while, i, P[i] <
P[i + 1] . ,
,
. .
P[j], P[i]. , P[i] , ,
, P[i] (, P[i + 1] > P[i]), , ,
P[i]. P[i] P[j] , P[i]
.
:

def P r e v P e r m u t a t i o n (P ) :
i

= l e n (P)

while i >= 0 and P [ i ] < P [ i + 1 ] :


i

if

i <

0:

P[:]

[]

return

j = l e n (P)

while P [ j ] > P [ i ] :
j
P[ i ] ,
P[ i

P[ j ]
1:]

= P[ j ] ,

P[ i ]

= P [ : i : 1]

. 0

(n 1)!

n = 4:

43

n!

P0

(1, 2, 3, 4)

P1

(1, 2, 4, 3)

P2

(1, 3, 2, 4)

P3

(1, 3, 4, 2)

P4

(1, 4, 2, 3)

P5

(1, 4, 3, 2)

P6

(2, 1, 3, 4)

P7

(2, 1, 4, 3)

P8

(2, 3, 1, 4)

P9

(2, 3, 4, 1)

P10

(2, 4, 1, 3)

P11

(2, 4, 3, 1)

P12

(3, 1, 2, 4)

P13

(3, 1, 4, 2)

P14

(3, 2, 1, 4)

P15

(3, 2, 4, 1)

P16

(3, 4, 1, 2)

P17
P18

=
=

(3, 4, 2, 1)
(4, 1, 2, 3)

P19

(4, 1, 3, 2)

P20

(4, 2, 1, 3)

P21

(4, 2, 3, 1)

P22

(4, 3, 1, 2)

P23

(4, 3, 2, 1)

, 1, 2 ..

(n 1)!

, -

,

. , 1, 0 , 2, ..

, .
, ,
,
. , ,

(n 1)!.

.
.

44

, , 1
1

n.

n,



. , (6, 4, 1, 9). 4! = 24, 4
3! = 6 , ,
( 6 > 1 6 > 4).
2 6 = 12 , (4, 1, 9).
2! = 2 ( 4 > 1),
2 (1, 9).
,

(9),

.
, ,

12 + 2 = 14.
:

def NumberByPermutation ( S ) :
n = len (S)

i f n <= 1 :
return 0
k = 0

f o r e l e m in S :
i f elem < S [ 0 ] :
k += 1

return math . f a c t o r i a l ( n

1)

k + NumberBySequence ( S [ 1 : ] )

def NumberByPermutation ( S ) :
ans = 0
n = len (S)

for

in r a n g e ( n ) :

k = 0

f o r e l e m in S [ i + 1 : ] :
i f elem < S [ i ] :
k += 1
a n s += math . f a c t o r i a l ( n

i )

return a n s

.

(n 1)!,

(n 1)!

,
, .
, .

def SequenceByNumber ( num ,

prefix ,

45

unused ) :

if

l e n ( u n u s e d ) == 0 :

return p r e f i x
n = l e n ( unused )
k = num / /

math . f a c t o r i a l ( n

1)

p r e f i x . append ( u n u s e d [ k ] )
u n u s e d . pop ( k )
num %= math . f a c t o r i a l ( n
SequenceByNumber ( num ,

1)

prefix ,

unused )

return p r e f i x
: num  , prex 
, ,
unused  , . , 100-

n=5

:
SequenceByNumber ( 1 0 0 ,

[] ,

[1 ,

2,

3,

4,

5]):

k  unused, , prex, unused,


.
:

def SequenceByNumber ( n , num ) :


ans =

[]

unused =

[ i

for

in r a n g e ( 1 , n + 1 ) ]

while n > 0 :
n

k = num / /

math . f a c t o r i a l ( n )

a n s . append ( u n u s e d [ k ] )
u n u s e d . pop ( k )
num %= math . f a c t o r i a l ( n )

return a n s

, :
1. .
2. ( - )
. .
.
,

O(n),

O(1).

 , -

46

,



O(n),

O(1),

.
 (. heap)

O(logn).

,
 . , , , ,
( 4 ) . .
,
.
, ,
. ,
().
:
.
, .
9 .

, . ,
1.
2, 3, 4 .
. :
Heap [ 1 ]

== 1 0 0

Heap [ 2 ]

== 1 9

Heap [ 3 ]

== 3 6

Heap [ 4 ]

== 1 7

Heap [ 5 ]

== 3

Heap [ 6 ]

== 2 5

47

Heap [ 7 ]

== 1

Heap [ 8 ]

== 2

Heap [ 9 ]

== 7

, H[i]
H[2*i], - H[2*i+1]. H[i]
H[i//2].
 Heap,
__data. size Heap ,
__data 1, __data . top () ,
__data[1].

c l a s s Heap ( ) :
__data =

def

[ None ]

size ( self ):

return l e n ( s e l f . __data )

def t o p ( s e l f ) :
return s e l f . __data [ 1 ]


.
, (
append ).
( ). , . .
, , ( )
.
, .
( ) :

c l a s s Heap ( ) :
def add ( s e l f , x ) :
H =

s e l f . __data

H . append ( x )
i

= l e n (H)

while i > 1 and x > H [ i


H[ i ]
i
H[ i ]

= H[ i

//

//

2]:

2]

//= 2
= x

add x. H ,
, .. self.__data. H ,

48

i . ,
. while,
i .
i, ,
i , x. i elem.


, , . -
. , .
, ,
, .
, .
, ,
. ,
( ,
.

c l a s s Heap :
def pop ( s e l f ) :
H =

if

s e l f . __data
s e l f . s i z e ( ) == 1 :

return H . pop ( )
result
H[ 1 ]
i

= H[ 1 ]

= H . pop ( )

= 1

while ( 2

+ 1 <

i f H[ 2

i ] > H[ 2

j = 2

and

l e n (H)

H [ i ] < max (H[ 2

i :2

1]:

2]))):

else :
j = 2
H[ i ] ,
i

if

H[ j ]

+ 1

= H[ j ] ,

H[ i ]

= j

i == l e n (H)

H[ i ] ,

H[ 2

i ]

and H [ i ] < H[ 2

= H[ 2

i ] ,

i ]:

H[ i ]

return r e s u l t

result,
. , , . . .
.
.
.

49

, ( )
,
.


( )
,

- .

O(h)

h.
h

1 + 2 + 4 + ... + 2h1 = 2h 1.
2h1 n < 2h , , h
n, O(log n).


-
(. heapsort). ,
- , -
. . , ,

O(n log n),

( -

) (
).
. - .
, ( ),
. , .

. -
. , . ,
.

9.1

, .
- .
- .  - . ,
ASCII- Unicode , , ,

50

, ,

h('b') = 2,

...,

h('z') = 26.

h('a') = 1,

-, 0
- .
2
-, :
1. - 1 2 .
2. - , .
3. .

a0 a1 -
h(a0 a1 ) = h(a0 )b + h(a1 ).

, -
(, ,

b = 27),

2 -

.
- :

h(a0 a1 a2 ) = h(a0 )b2 + h(a1 )b + h(a2 )

.. ,

b = 27, - 'one' hash('one') =


hash('o')b2 + hash('n')b + hash('e') = 15 272 + 14 27 + 5 = 11318.
, n - n1
: h(a0 a1 a2 . . . an1 ) = h(a0 )b
+ h(a1 )bn2 + ... + h(an2 )b +
h(an1 ). a0 a1 a2 . . . an1 b, ,
h(a0 a1 a2 . . . an1 , ,
b,

- . ,

n1

a0 , a1 ,

...,

an1 ,

x = b.

( ),
( -
,
-

M . M

2, , ,

b.

232

264 .

, - :

h(a0 a1 a2 . . . an1 ) = (h(a0 )bn1 + h(a1 )bn2 + ... + h(an2 )b + h(an1 )) mod M
- ,
:

51

h(a0 a1 a2 . . . an1 ) =

= (h(a0 )bn2 + h(a1 )bn3 + ... + h(an2 ))b + h(an1 ) mod M =
= (h(a0 a1 a2 . . . an2 )b + h(an1 )) mod M
-

a0 a1 a2 . . . an1

a0 a1 a2 . . . an2 , b, an1 M . ,

, :
b = 27
M = 10

17 + 3

def Hash ( S ) :
result

= 0

f o r c h a r in S :
result

r e s u l t += o r d ( c h a r )

ord ( ' a ' ) + 1

r e s u l t %= M

return r e s u l t
S T
m , , - S
m
m , b ,
- T .

h(ST ) = (h(S)bm + h(T )) mod M


-

T,

- .
, -

h(S).

h(ST )

T:

h(T ) = (h(ST ) h(S)bm ) mod M


S -
S[i : j] (, S[i : j]
i j 1 j i), ,
- i j :
,


h(S[i : j]) = h(S[: j]) h(S[: i])bji mod M
-

S , - O(1), bm mod M .

def Hash ( i , j , P r e f i x , Power ) :


return ( P r e f i x [ j ] P r e f i x [ i ]

52

Power [ j

i ])

mod M

:
i j S. S ,
. Prex -
S, Prex[i] c S[i] S. Power

M,

= bi mod M .

Power[i]

Prex Power , , , . : alcPrex


S Prex

n+1

 -

S), - S,

CalcPower,

n.

b = 27
M = 10

17 + 3

def C a l c P r e f i x ( S ) :
n = len (S)
Prefix =

for

[0]

(n + 1)

in r a n g e ( n ) :

Prefix [ i

+ 1] = ( Prefix [ i ]

b + h(S [ i ] ) )

% M

return P r e f i x
def C a l c P o w e r ( n ) :
Power =

for

[1]

(n + 1)

in r a n g e ( n ) :

Power [ i

+ 1 ] = Power [ i ]

b % M

return Power
def h ( c h a r ) :
return o r d ( c h a r )

ord ( ' a ' ) + 1

S
:
Prefix = CalcPrefix (S)
Power = C a l c P o w e r ( l e n ( S ) )

O(n),

Hash

O(1)

- , , , .

9.1.1

m.

S = s0 s1 . . . sn1

T = t0 t1 . . . tm1

, S,
T. ,
.

53

k.

, ,
, .
-

, -

S  (set), .

, -

set. -

- S,

True.

IsCommonSubstring.
:

k , -

Prex1 Prex2 -
( , - -
), Power

-.

def I s C o m m o n S u b s t r i n g ( k ,

Prefix1 ,

Prefix2 ,

Power ) :

S = set ()

for

in r a n g e ( k ,

S . add ( Hash ( i

for

in r a n g e ( k ,

len ( Prefix1 ) ) :

k,

i ,

Prefix1 ,

Power ) )

len ( Prefix2 ) ) :

i f Hash ( i k , i ,
return True
return F a l s e

Prefix2 ,

Power )

in S :

: -

k , k 1,
k ,

. -

b:

Prefix1 = CalcPrefix (S)


P r e f i x 2 = C a l c P r e f i x (T)
Power = C a l c P o w e r ( max ( l e n ( S ) ,

l e n (T ) ) )


left = 0, ,
0.
right = min(len(S), len(T)) + 1,
,
. left right :
left,
right. right
left + 1,
left.

54

left

= 0

r i g h t = min ( l e n ( S ) ,

l e n (T ) ) + 1

while r i g h t > l e f t + 1 :
middle = ( l e f t

if

+ right )

//

IsCommonSubstring ( middle ,
left

Prefix1 ,

Prefix2 ,

Power ) :

= middle

else :
r i g h t = middle

print ( l e f t )

10
10.1

, , ( ) . , ( . .)
, .
 .

 .

. -

. .
,  . , ,
,  , ,
 .
u A B , ,
u A B, u. , , .
,
(  ). ,
. ,
. .
( ,
  , ).
,
.


n(n 1)/2.

n 1,

, .
:
.   
,
.

55

, ,

u1 , u2 , . . . , uk , -

. ,  .
, .
,
. .
,
. ,
(), .
. ,
.
,

?
,

n1 - ,

n1

. ,

( ). .
:
.

, ,
.
.
:

n1

n,

-
1.
.
, :
1. , .
2. ,

n1

.
3. , .
4. ,
.
, ,
. .

56

10.2

 (
, ),
:
1.

2. ,

u.

.
, ,

.
:


( ),
A[i][j] 1, i j 0
. :
1

, .

 A[i][j],
, ( ,
).

O(n2 )

.
i
W[i] . :
W[ 1 ]

= [2 ,

3,

4]

W[ 2 ]

= [1 ,

4,

5]

W[ 3 ]

= [1 ,

4]

57

W[ 4 ]

= [1 ,

2,

W[ 5 ]

= [2 ,

4]

3,

5]

, :
W =

[[] ,

[2 ,

3,

4] ,

[1 ,

4,

5] ,

[1 ,

4] ,

[1 ,

2,

3,

5] ,

[2 ,

4]]

0, W[0].
, i (
W[i]), i j  , j
W[i]. , -

O(1).

. A[i][j] 1, , i
j. i
j , W[i] j.
, :

:
1

:
W[ 1 ]

W[ 2 ]

= [4 ,

[2]
5]

W[ 3 ]

= [1 ,

4]

W[ 4 ]

= [1 ,

3]

W[ 5 ]

[]

. , :

, - -

. ,
:

58

5
1
2
5
4
1
1
3

7
2
5
4
2
4
3
4
.

(n + 1) (n + 1),

n , m = map ( i n t ,
A =

[[0]

for

i
u,

input ( ) . s p l i t ( ) )

for

(n + 1)

in r a n g e ( n + 1 ) ]

in r a n g e (m) :
v = map ( i n t ,

A[ u ] [ v ]

input ( ) . s p l i t ( ) )

= 1

# A[ v ] [ u ] = 1
, :
n , m = map ( i n t ,
W =

for

i
u,

for

input ( ) . s p l i t ( ) )

in r a n g e ( n + 1 ) ]
in r a n g e (m) :

[ set ()

v = map ( i n t ,

input ( ) . s p l i t ( ) )

W[ u ] . add ( v )

# W[ v ] . add(u)

. , u v
v u.


,
 . .
.
, A[i][j] i
j. ,
, None.
,
.

, ,
,  . :
n , m = map ( i n t ,
W =

[ dict ()

for

input ( ) . s p l i t ( ) )
i

in r a n g e ( n + 1 ) ]

59

for

in r a n g e (m) :

u,

v,

w e i g h t = map ( i n t ,

W[ u ] [ w ]

input ( ) . s p l i t ( ) )

= weight

u v if v in W[u], W[u][v].

10.3

(. breadth-rst search, BFS)


(
) .
, .
 -

,

d.

d,

- ,

d + 1.

d[i] i.
s, d[s] = 0.

s 1, , ,

1, 2 ( 0 1) ..
, .

d ,  None.
None, , 0. ,
0,
1. , 1,
, , 2 (
None). , 2 , 3 ..
,

n1

),

n 1.
, , , . .
,
. ,  ,
. ,
 .
,
.
, , ,
, .
,

60

d,

d + 1,

d,

d + 1.

.
D =

[ None ]

D[ s t a r t ]
Q =

(n + 1)

= 0

[ start ]

Qstart = 0

while Q s t a r t < l e n (Q ) :
u = Q[ Q s t a r t ]
Q s t a r t += 1

f o r v in V [ u ] :
i f D [ v ] i s None :
D[ v ]

= D[ u ]

+ 1

Q . append ( v )
n  c ,
1 n. ( )
start. Q  , , Qstart  .
 append ,
 Qstart 1 (
Q[Qstart]).
start, D[start] = 0 ( ).
, Qstart < len(Q). u.
v. v ,
D[v] is None, v
u, 1, v
.

O(n + m),

. ,

O(n2 ),

n .

. ,
,  , .
. - , ,
.
:
Prev =

[ None ]

(n + 1)

61

Prev[i] i
start. i Prev[i],
Prev[i] i.
v ,
u, v u:
Prev [ v ]

= u

( start nish) Ans , ,


None, :
Ans =
curr =

[]
finish

while c u r r

i s not None :

Ans . append ( c u r r )
c u r r = Prev [ c u r r ]
Ans start
nish, .

10.4

( ) (. depth-rst search, DFS) ,


, .
,
( ) , , .
, , . ,
, , , , , ,
.
,
.
.
()
( ).
, .
:
1. - .
2. , .
3. .

62

4. , .
, 
,
. :
A B, B
A . 
, ,
(,
, ). ,
:
1. - , .
2.
3. .
4. 1-3 .
,
,  . Visited,
Visited[i] == True , Visited[i] == False
.  
.

,
.
DFS(start),
start  , .
Visited =
Prev =

[ False ]

[ None ]

(n + 1)

(n + 1)

def DFS( s t a r t ) :
Visited [ start ]

= True

f o r u in V [ s t a r t ] :
i f not V i s i t e d [ u ] :
Prev [ u ]

start

DFS( u )
n  , 1 n, V[u] u.
, , start
DFS(start). , start, Visited, Prev
start .
, Start,
DFS .

63

. ,
.
, . - , ,
DFS .
Visited =

[ False ]

(n + 1)

def DFS( s t a r t ) :
Visited [ start ]

= True

f o r v in V [ s t a r t ] :
i f not V i s i t e d [ v ] :
DFS( v )
NComp = 0

for

in r a n g e ( 1 , n + 1 ) :
i f not V i s i t e d ( i ) :

NComp += 1
DFS( i )
DFS  . , ,
. , ,
.
DFS , ( ).
Visited Color, 0 , 1 2 - .
DFS . , ,
. ,
, - ,
, , ( IsBipartite False,
, ).
Color =

[0]

IsBipartite

(n + 1)

= True

def DFS( s t a r t ) :
global I s B i p a r t i t e
f o r u in V [ s t a r t ] :
i f C o l o r [ u ] == 0 :
Color [ u ]

= 3

Color [ s t a r t ]

DFS( u )

else

if

C o l o r [ u ] == C o l o r [ s t a r t ] :

IsBipartite

for

= False

in r a n g e ( 1 , n + 1 ) :

64

if

C o l o r [ i ] == 0 :
Color [ i ]

= 1

DFS( i )

1 DFS
.
DFS - .
, , , DFS ,
. DFS
. 0 () . 1 () ,
2 () . 1 2 - .
, DFS ,
1.
Color =

[0]

(n + 1)

CycleFound = F a l s e

def DFS( s t a r t ) :
Color [ s t a r t ]

= 1

f o r u in V [ s t a r t ] :
i f C o l o r [ u ] == 0 :
DFS( u )

else

if

C o l o r [ s t a r t ] == 1 :

C y c l e F o u n d = True
Color [ s t a r t ]

for

if

= 2

in r a n g e ( 1 , n + 1 ) :
C o l o r [ i ] == 0 :
DFS( i )

, - . .
,
.

DFS, .
.
Visited =
Ans =

[ False ]

(n + 1)

[]

def DFS( s t a r t ) :
Visited [ start ]

= True

f o r u in V [ s t a r t ] :
i f not V i s i t e d [ u ] :
DFS( u )

65

Ans . append ( s t a r t )

for

in r a n g e ( 1 , n + 1 ) :
i f not V i s i t e d ( i ) :

DFS( i )
Ans = Ans [ : :

10.5

1]

(Edsger Dijkstra). 1959



, , .
.
( , ) ,
i j W[i][j], W
. i j
, W[i][j] == INF
INF. INF , ,
- ,
INF

109

 . start i
D[i]. D[start]=0, D[i]=INF i.
start start 0,
.
D, .
.
i j W[i][j], D[i] + W[i][j] < D[j]. i i j,
,
j. D[j], D[j] = D[i] + W[i][j].
, ,
 .
. i, , D[i] , D[i]
i. , D[i] i
start i,
( i).
.
i D[i]. , i, , -

66

, i.
,
INF ( ).
. N  , 0 N-1.  start
W.
INF = 10
D =

[ INF ]

D[ s t a r t ]

10
N

= 0

Colored =

[ False ]

while True :
m i n _ d i s t = INF

for

in r a n g e (N ) :
i f not C o l o r e d [ i ] and D [ i ] < m i n _ d i s t :

min_dist = D[ i ]
min_vertex =

if

m i n _ d i s t == INF :

break
i

= min_vertex

Colored [ i ]

for

= True

in r a n g e (N ) :

i f D [ i ] + W[ i ] [ j ] < D [ j ] :
D[ j ]

= D[ i ]

+ W[ i ] [ j ]

print (D)
Colored ,
. D Colored. ,
,
min_vertex,  min_dist.
min_dist INF, .
,
.

O(n2 ),

, ,

, ,
. , .
i j, start
j i i-j. i j
j.

, . ,
i W[i]. , ,

67

Weight, .
i j Weight[i, j] .
D =

[ INF ]

D[ s t a r t ]
Prev =

= 0

[ None ]

Colored =

[ False ]

while True :
m i n _ d i s t = INF

for

in r a n g e (N ) :
i f not C o l o r e d [ i ] and D [ i ] < m i n _ d i s t :

min_dist = D[ i ]
min_vertex =

if

m i n _ d i s t == INF :

break
i

= min_vertex

Colored [ i ]

for

= True

in W[ i ] :

i f D [ i ] + Weight [ i ,
D[ j ]

= D[ i ]

Prev [ j ]

j ] < D[ j ] :

+ Weight [ i ,

j ]

start j :
Path

=[]

while j

i s not None :

Path . append ( j )
j = Prev [ j ]
Path = Path [ : :

1]

, . ,
. , .
,
. , , .

O(log n),

O(log n),

O(m log n).

O(n log n + m log n) = O((n + m) log n).

 ,

, .

68

10.6

- , , . ,
, ,
. , .
- . :
F[k][i]  i,
k .
k=0. F[0][start]
= 0, i F[0][i] = INF, ,
start start,
,
INF.
F
k, , 1 ,
, 2 .. ,

n 1 (n - ),

F[n-1][i],
start i).
, F[k][i].
start i, k .
j-i. j k-1
, , F[k-1][j], i
F[k-1][j] + W[j][i], W[j][i] j-i. j, ,
F[k-1][j] + W[j][i].
:
INF = 10
F =

[ [ INF ]

F[ 0 ] [ start ]

10

for

in r a n g e (N ) ]

= 0

f o r k in r a n g e ( 1 , N ) :
f o r i in r a n g e (N ) :
F[ k ] [ i ]

for

= F[ k

1][ i ]

in r a n g e (N ) :

i f F[ k

1][ j ]

F[ k ] [ i ]

+ W[ j ] [ i ] < F [ k ] [ i ] :

= F[ k

1][ j ]

+ W[ j ] [ i ]

O(n3 ).

. , F
  F[k][i] k, F[i] i,
. :
INF = 10

10

69

F =

[ INF ]

F[ start ]

= 0

f o r k in r a n g e ( 1 , N ) :
f o r i in r a n g e (N ) :
f o r j in r a n g e (N ) :
i f F [ j ] + W[ j ] [ i ] < F [ i ] :
F[ i ]

= F[ j ]

+ W[ j ] [ i ]

, j-i,
. j
i j-i .
,
, ,
, .
, j-i
W[j, i],  j, i,  .

.
, W - :
INF = 10
F =

[ INF ]

F[ start ]

10
N

= 0

f o r k in r a n g e ( 1 , N ) :
f o r j , i in W. k e y s ( ) :
i f F [ j ] + W[ j , i ] < F [ i ] :
F[ i ]

= F[ j ]

+ W[ j ,

i ]

- :
1. F F[start] = 0, F[i] = INF
i.
2. j-i , j-i.
3. 2 n-1 .

O(nm),

mm n2 )

- ,

. , (

, (

m n)

, .
,
:
INF = 10
F =

[ INF ]

Prev =

10
N

[ None ]

F[ start ]

= 0

f o r k in r a n g e ( 1 , N ) :
f o r j , i in W. k e y s ( ) :
i f F [ j ] + W[ j , i ] < F [ i ] :

70

F[ i ]

= F[ j ]

Prev [ i ]

+ W[ j ,

i ]

= Prev [ j ]

.
- ,
:
INF = 10
F =

[ INF ]

F[ start ]

10
N

= 0

Stop = F a l s e
k = 1

while k < N and not S t o p :


k += 1
S t o p = True

f o r j , i in W. k e y s ( ) :
i f F [ j ] + W[ j , i ] < F [ i ] :
F[ i ]

= F[ j ]

+ W[ j ,

i ]

Stop = F a l s e
- , ,
. .
, , .
CycleFound = F a l s e

f o r j , i in W. k e y s ( ) :
i f F [ j ] + W[ j , i ] < F [ i ] :
C y c l e F o u n d = True

break

10.7

( -, FloydWarshall) ,
, .
.
,

n 1.

ij

0
wij .

wij = +,

ij

wii = 0.

j,

akij

( ).

a0ij

i j , 0
, ij , aij = wij .
1
aij = wij , 2
0, aij

71

0 1 ..

anij

anij

j.
0
1
2
n
aij , aij , aij , . . . , aij , 0
k . - aij = wij .
k1
k
, aij
aij . i j , , , k ,
k 1. k 1,
k1
aij . k 1,
: i (k 1) (k 1) j .
, k 1,
k1
k1
ai,k1 + ak1,j .

, :

k1
k1
akij = min(ak1
ij , ai,k1 + ak1,j )
. , ,
A =

for

k , i, j :

f o r j in r a n g e ( n ) ]
in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
[ [ [ INF

for

in r a n g e ( n ) ]

f o r k in r a n g e ( n + 1 ) ]

A[ 0 ] [ i ] [ j ]

= W[ i ] [ j ]

f o r k in r a n g e ( 1 , n + 1 ) :
f o r i in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
A[ k ] [ i ] [ j ]

= min (A [ k

A[ k

1][
1]

1][ i ][ k

i ][ j ] ,
+ A[ k

1][k

1][ j ])

j,

. , A:

A[i][j], -

A[i][j]. k,
k-1 k.
[ [W[ i ] [ j ] f o r j in r a n g e ( n ) ]
f o r k in r a n g e ( n ) :
f o r i in r a n g e ( n ) :
f o r j in r a n g e ( n ) :

A =

A[ i ] [ j ]

for

= min (A [ i ] [ j ] ,

in r a n g e ( n ) ]

A[ i ] [ k ]

+ A[ k ] [ j ] )

O(n3 ).

, A[i][j] . ,
A[i][j] INF,
. A[i][j] INF
(, INF
),

72

, A[i][k] A[k][j]
INF, , INF,
.
,

i j

, .
:

i , A[i][i]

.
. , Prev[i][j] ,

i.

A[i][j] .
,

k,

ij

k,

Prev[i][j]=Prev[k][j].

j i j, :

for

i in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
i f W[ i ] [ j ] < INF :
Prev [ i ] [ j ]

, , :
A =

for

[ [W[ i ] [ j ]

Prev =

[[( i

if

j
!=

in r a n g e ( n ) ] f o r
j e l s e None ) f o r

i
j

in r a n g e ( n ) ]
in r a n g e ( n ) ]

for

f o r k in r a n g e ( n ) :
f o r i in r a n g e ( n ) :
f o r j in r a n g e ( n ) :
i f (A [ i ] [ k ] < INF and A [ k ] [ j ] < INF and
A[ i ] [ k ]
A[ i ] [ j ]

Prev [ i ] [ j ]

+ A[ k ] [ j ] < A[ i ] [ j ] ) :

= A[ i ] [ k ]

ij

+ A[ k ] [ j ]

= Prev [ k ] [ j ]

, Path:
Path

=[]

while j

i s not None :

Path . append ( j )
j = Prev [ i ] [ j ]
Path = Path [ : :

1]

73

in r a n g e ( n ) ]

You might also like