{"id":470894,"date":"2025-08-15T15:01:39","date_gmt":"2025-08-15T15:01:39","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=470894"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=470894","title":{"rendered":"<span>\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c bzip2-\u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043e\u0440 \u043d\u0430 Python: \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/448\/058\/bf7\/448058bf7d878a03d753f18915439d95.png\" width=\"1600\" height=\"898\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/448\/058\/bf7\/448058bf7d878a03d753f18915439d95.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/448\/058\/bf7\/448058bf7d878a03d753f18915439d95.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u042f \u0420\u043e\u043c\u0430, \u0431\u044d\u043a\u0435\u043d\u0434\u0435\u0440-\u043f\u0438\u0442\u043e\u043d\u0438\u0441\u0442 \u0432 <a href=\"https:\/\/kts.tech\/\" rel=\"noopener noreferrer nofollow\">KTS<\/a>.<\/p>\n<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0432 \u043c\u043e\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u043e\u0431 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bzip2#Implementation\" rel=\"noopener noreferrer nofollow\">\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438 bzip2<\/a>. \u041f\u0435\u0440\u0432\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/kts\/articles\/831440\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0439 \u0442\u0435\u043c\u044b \u043e\u043d\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430. \u041d\u0438\u0436\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u044d\u0442\u0430\u043f \u0441\u0436\u0430\u0442\u0438\u044f bzip2.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430: \u0432 \u0441\u0432\u043e\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438 bzip2 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 Python. \u0412\u0441\u044e \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044e \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u2014 \u0446\u0438\u043a\u043b \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043b\u044c. \u041e\u043d \u0432\u044b\u0440\u043e\u0441 \u0438\u0437 <a href=\"https:\/\/github.com\/sentenzo\/bzip2\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u0438\u0441\u0430\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 bzip2-\u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043e\u0440 \u043d\u0430 Python (\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u043e \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c bzip2, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439).\u00a0<\/p>\n<p>\u0414\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u0432\u0435\u0441\u044c\u043c\u0430 \u0443\u0432\u0435\u0441\u0438\u0441\u0442\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u00ab\u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u043d\u0438\u0442\u0430\u00bb. \u0412\u043f\u043e\u043b\u043d\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0438 \u043c\u043d\u0435, \u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0436\u0438\u0437\u043d\u0438 \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f. \u0418 \u0432\u0441\u0435 \u0436\u0435 \u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u0438\u043b\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0433\u0440\u0430\u043d\u0438\u0442 \u043d\u0430 \u0444\u0440\u0430\u043a\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043e\u0432\u0430\u0440\u0438\u043c\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/p>\n<p>\u041c\u043e\u044f \u0438\u0434\u0435\u044f \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u043e\u0441\u0438\u043b\u0438\u0432\u0448\u0438\u0439 \u0432\u0435\u0441\u044c \u0446\u0438\u043a\u043b, \u043c\u043e\u0433 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c bzip2-\u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043e\u0440 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d \u0432\u043b\u0430\u0434\u0435\u0435\u0442), \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438\u0437 \u043c\u043e\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.\u00a0<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0432 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u043e\u043c\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python3. \u0421\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><strong>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0%20bzip2\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0437\u043e\u0440 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20BWT%20%D0%B8%20%D0%BA%D0%B0%D0%BA%20%D0%BE%D0%BD%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82?\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 BWT \u0438 \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#Encoding\" rel=\"noopener noreferrer nofollow\">Encoding<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%20%D1%87%D1%82%D0%BE%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Decoding\" rel=\"noopener noreferrer nofollow\">Decoding<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%20%D1%87%D1%82%D0%BE%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B52\" rel=\"noopener noreferrer nofollow\">\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%98%D0%BC%D0%BF%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20BWT%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 BWT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%20%D0%BF%D1%80%D0%B8%20%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%98%D0%B7%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%D1%81%D1%8F%20%D0%BE%D1%82%20%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B5%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8%20%D0%BF%D1%80%D0%B8%20%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%B4%20%D1%81%D0%BE%20%D0%B2%D1%81%D0%B5%D0%BC%D0%B8%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%D0%BC%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%92%20%D1%81%D1%83%D1%85%D0%BE%D0%BC%20%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u041e\u0431\u0437\u043e\u0440 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2<\/h2>\n<p><a class=\"anchor\" name=\"%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0%20bzip2\" id=\"\u041e\u0431\u0437\u043e\u0440 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2\"><\/a><\/p>\n<p>\u0421\u043b\u043e\u0432\u043e\u043c \u00abbzip2\u00bb \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0442\u0430\u043a \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0430\u044f \u0435\u0433\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bzip2\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430<\/a>. \u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043d\u043e\u0435) \u043f\u043e\u0434 \u0441\u043b\u043e\u0432\u043e\u043c \u00abbzip2\u00bb \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432\u0432\u0435\u0434\u0435\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438. <strong>\u0410\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u044f <\/strong>\u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><strong>\u0441\u0436\u0430\u0442\u0438\u0435<\/strong>: \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435;<\/p>\n<\/li>\n<li>\n<p><strong>\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0441\u0442\u044c<\/strong>: \u043c\u043e\u0436\u043d\u043e \u00ab\u0440\u0430\u0437\u0436\u0430\u0442\u044c\u00bb \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0436\u0430\u0442\u043e, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c bzip2 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e, \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0436\u0438\u043c\u0430\u044e\u0442:<\/p>\n<p><code>RLE -&gt; BWT -&gt; MTF -&gt; RLE -&gt; HFC<\/code><\/p>\n<p>\u041f\u0440\u0438 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u0439\u043b \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u043b\u043e\u043a\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b (\u0443\u0441\u043b\u043e\u0432\u043d\u043e, 100 KiB), \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0431\u043b\u043e\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e. \u041f\u0440\u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0435 (\u0434\u0435\u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438) \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0434\u0442\u0438 \u043f\u043e \u0443\u0437\u043b\u0430\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435.<\/p>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f RLE (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Run-length_encoding\" rel=\"noopener noreferrer nofollow\">Run-Length Encoding<\/a>) \u0438 HFC (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Huffman_coding\" rel=\"noopener noreferrer nofollow\">Huffman coding<\/a>) \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0441\u0436\u0430\u0442\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f BWT (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Burrows%E2%80%93Wheeler_transform\" rel=\"noopener noreferrer nofollow\">Burrows-Wheeler transform<\/a>) \u0438 MTF (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Move-to-front_transform\" rel=\"noopener noreferrer nofollow\">Move-to-front transform<\/a>) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e: \u043d\u0435 \u0441\u0436\u0438\u043c\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u0440\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u0438\u0445 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0441 \u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/kts\/articles\/831440\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 RLE, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0446\u0435\u043b\u044b\u0445 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. RLE <em>(aka Run-Length Encoding aka \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u0435\u0440\u0438\u0439) <\/em>\u2014 \u044d\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0440\u043e\u043a\u0443 <code>\"goooogle\"<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432 <code>\"g4ogle\"<\/code> (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432\u0441\u0451 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u043d\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a). RLE \u0432 bzip2 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0441\u0436\u0430\u0442\u0438\u044f, \u043d\u043e \u043e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.\u00a0<\/p>\n<p>BWT \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a Burrows-Wheeler transform (\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430). \u041e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0437\u0432\u0435\u043d\u043e\u043c \u0446\u0435\u043f\u0438, \u0438, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2.<\/p>\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u0430\u043b\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e BWT. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0442\u0430\u043a\u043e\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u0443 \u043c\u0435\u043d\u044f \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0434\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u0434 \u0441\u0432\u043e\u0438\u043c \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438, \u0430 \u0431\u0435\u0437 \u043d\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e. \u041f\u043e \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0443\u043c\u043a\u0435, \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u0437\u0435\u043c\u043b\u0435\u043a\u043e\u043f\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0445\u043e\u0442\u044f\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043c\u043e\u0439 \u043f\u0443\u0442\u044c.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0438\u0432\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0441\u043c\u044b\u0441\u043b \u0441\u0442\u043e\u0438\u0442 \u0437\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u044f\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u044f\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u043e \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0435 \u0438 \u043c\u0435\u043d\u0435\u0435 \u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432\u043e\u0435.\u00a0<\/p>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 BWT \u0438 \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/h2>\n<p><a class=\"anchor\" name=\"%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20BWT%20%D0%B8%20%D0%BA%D0%B0%D0%BA%20%D0%BE%D0%BD%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82?\" id=\"\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 BWT \u0438 \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?\"><\/a><\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u0445. \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 BWT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0431\u0430\u0439\u0442\u0430\u0445, \u043d\u043e \u0432 \u044d\u0442\u0443 \u0432\u0435\u0440\u0441\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043c\u044b \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u043b \u0432\u044b\u0448\u0435, BWT \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u00abencode\u00bb (\u043f\u0440\u044f\u043c\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f) \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0435 \u043c\u0435\u0442\u043e\u0434 \u00abdecode\u00bb (\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, BWT \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435, \u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0430\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b.<\/p>\n<p>\u0412\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b BWT \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u044f\u0449\u0438\u043a\u0430:<\/p>\n<pre><code class=\"python\">bwt.encode(\"habrahabr\") -&gt; \"rhhraaa$bb\" bwt.decode(\"rhhraaa$bb\") -&gt; \"habrahabr\"  bwt.encode(\"abracadabra\") -&gt; \"ard$rcaaaabb\" bwt.decode(\"ard$rcaaaabb\") -&gt; \"abracadabra\"<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b <code>\"$\"<\/code>, \u043d\u043e \u043e \u043d\u0435\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435). \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e BWT \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u043a\u0440\u044b\u0442\u044b\u043c\u0438 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043e\u043d \u0447\u0430\u0441\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0435\u0440\u0438\u0438 (\u0430 \u0442\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0438\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0436\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 RLE).<\/p>\n<p>\u0412\u043e\u0442 \u0435\u0449\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043a\u0443\u0441\u043e\u043a \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0439 \u0445\u0443\u0434\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438:<\/p>\n<pre><code>eeeeeaoeeaioeaeeeaeeV7ZgfKHOOLXRArEs\/BHQ+rujieeeEnyeReeeeeoooeoeooeeaaao oooooooooaaiiiiieeinaaaaaaaaaaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeejeeeeeeeeeeeeeepfw\\nAf874n24BZKGCufni\/u\/bbbI?\/x5t97v9IIOoNB0pr\/f 0RfQQFaeedef4Gke\/CnWNeeeeeeeeaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeEeeeEeeeeeeEEeeeeeeeeeeeeeeeeeeNseeeeeeeeeeeeeeeee eeeeeEeeeeeeeeeeeeeeeeeeeeEeeeeeeeeeeeeeEeeeeeeeeeeWpeeeeeeeeeeeFPf+yMPd 6P2rteOptbY9vYVfPtqQy4Yeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeLE2eeiieEeeeeeeeeEeeeeeeeeeeeeeeeeeeeeeeeeiiiieeeeeeeeeEe8bee eeeEeeeeeeeeEEeeeeeeeeeeeeeeeeeeeiiiiiiiiiee9FFtSp26Lpaeeuees\/VKDB1Taaaa eQTDIQdbPooooooOoo9KoowazlAPB+Kea3rFMCaalrblzrbllltabtadmmrrtrltcttMlaar lhollralbeatheeedlrrlhlelleeleerllmdllelnnldmlemalBeeelhnamrleeelelleael dbllallellhhllrlklllblbmblhlltttrlnddlbnMMnmMMmMmmmMrlhlllhlhhhahhlrlhll ldplhugghlmlbbmbrbbllbtttbbahhhlllrrhdhaeerktkkhblrllllbblbaabblblllllll lbablllblllblbllbbarbrbblblrallaarzraalprrrrrprrlmnrgellllcalllrendeelll nlmllrllllrllrlltalrdlblalallMktlttlbblaeBlebnbaaatlaaeelleshlllbbllbllm rtdlmglrradrrxtrtlranrdaltrekltrrtrzrrarttrcrgrtkgaaghblrrrtrtbttgrrstll rllltbrarbmlrhlbflbkhbaolaatmmlkllndmteeeeeeeleleenehheeeeeeehebtmmlmmmr kmnnallllllalalMmelrrgvlrtdlllellllslltlbarkvlglalzrlalnmmmllllllllabggt allcrllllrllllngenaallllMalladlaallrmrllaadllaallaaammmamdllllndnnnnraee laaalaaalllllllllddllrlctakrddllolblaelaldrmmmmrrmmmelnalaalamdlmrrrnnbn lrmlbllltmmMnmmMmnrMtehoemmmmmmmMmtmrrMammverllllelmplheehclreeldttlrlrl larreeureeeedleeeeeedeteeeeehhleeeeeehhhllrlrmlrntmthnnBllrknmlmrnlllnba errellneettklneadeermmmdbelmmbrrrllllrrntdlnlglllnleemlnrlllbllelglrrelk eeeeeedeeeeeemeeeehleeeeeeeellrMnelrrdrrbllrmtkdnaeeeeterrrlnnssrttallmr<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0438 \u0434\u043b\u0438\u043d\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0435. \u0421\u0436\u0430\u0442\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 RLE \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0<\/p>\n<p>\u041f\u043e\u0440\u0430 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0447\u0435\u0440\u043d\u043e\u0433\u043e \u044f\u0449\u0438\u043a\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e (\u0437\u0430\u0442\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0443\u044e) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<h3>Encoding<\/h3>\n<p><a class=\"anchor\" name=\"Encoding\" id=\"Encoding\"><\/a><\/p>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434 BWT \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0430 <code>\"habrahabr\"<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 BWT \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0439 \u043a\u0430\u043a \u0441 \u043a\u043e\u043b\u044c\u0446\u043e\u043c (\u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043c \u0438\u0437 \u043e\u0431\u0449\u0435\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b): \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u044b\u043c, \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u0433\u0434\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c, \u0430 \u0433\u0434\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u043b\u0430\u0441\u044c. BWT \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 <code>\"habrahabr\"<\/code> \u0438 <code>\"abrahabrh\"<\/code>.<\/p>\n<p>\u041d\u043e \u043c\u044b-\u0442\u043e \u0432\u0438\u0434\u0438\u043c \u044d\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043c\u0435\u0441\u0442\u0435 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u043c\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c <code>\"$\"<\/code>. \u041d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e \u00ab\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u00bb.<\/p>\n<pre><code class=\"python\">\"habrahabr\" =&gt; \"habrahabr$\"<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 \u0431\u044b\u043b \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u044f\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u0441\u0435\u0445 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432. \u041e\u043d\u0430 (\u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c) \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0432\u0441\u0435 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"python\">\"habrahabr$\" \"abrahabr$h\" \"brahabr$ha\" \"rahabr$hab\" \"ahabr$habr\" \"habr$habra\" \"abr$habrah\" \"br$habraha\" \"r$habrahab\" \"$habrahabr\"<\/code><\/pre>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<pre><code class=\"python\">\"$habrahabr\" \"abr$habrah\" \"abrahabr$h\" \"ahabr$habr\" \"br$habraha\" \"brahabr$ha\" \"habr$habra\" \"habrahabr$\" \"r$habrahab\" \"rahabr$hab\"<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u0442.\u0435. \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0431\u0443\u043a\u0432\u0443 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438). \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:\u00a0<\/p>\n<pre><code class=\"python\">\"$habrahab\" + \"r\" \"abr$habra\" + \"h\" \"abrahabr$\" + \"h\" \"ahabr$hab\" + \"r\" \"br$habrah\" + \"a\" \"brahabr$h\" + \"a\" \"habr$habr\" + \"a\" \"habrahabr\" + \"$\" \"r$habraha\" + \"b\" \"rahabr$ha\" + \"b\"  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2570\u2192 \"rhhraaa$bb\"<\/code><\/pre>\n<h4>\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/h4>\n<p><a class=\"anchor\" name=\"%D0%9D%D0%B0%20%D1%87%D1%82%D0%BE%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5\" id=\"\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\"><\/a><\/p>\n<ol>\n<li>\n<p>\u0421\u0438\u043c\u0432\u043e\u043b \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u043c \u043f\u0430\u043b\u043a\u0438 \u0432 \u043a\u043e\u043b\u0435\u0441\u0430. \u041c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430, \u0430 \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c\u0441\u044f \u0442\u0435\u043a\u0441\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430, \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435: \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u043d\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e: \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043a\u0430\u043a-\u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043c\u0435\u0442\u0438\u043b\u0438 \u0431\u044b \u0438\u0445 \u0447\u0438\u0441\u043b\u0430\u043c\u0438: <code>h\u2081 a\u2081 b\u2081 r\u2081 a\u2082 h\u2082 a\u2083 b\u2082 r\u2082<\/code>), \u043c\u044b \u0431\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043b\u0438, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ol>\n<li>\n<p>\u043f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443, \u0442.\u0435. \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b \u0438 \u043a \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c (\u0432\u0435\u0434\u044c \u0438\u0437 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446);<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435 \u0441\u0442\u0440\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u0445 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u0430\u043c\u0438, \u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432 \u0441\u0430\u043c\u0438\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"O(N^2)\" alt=\"O(N^2)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb1\/11d\/f7a\/bb111df7a5ea1d2076cfaa4fc460e929.svg\" width=\"56\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb1\/11d\/f7a\/bb111df7a5ea1d2076cfaa4fc460e929.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bb1\/11d\/f7a\/bb111df7a5ea1d2076cfaa4fc460e929.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0438 \u044d\u0442\u043e <em>\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e<\/em>.<\/p>\n<\/li>\n<\/ol>\n<h3>Decoding<\/h3>\n<p><a class=\"anchor\" name=\"Decoding\" id=\"Decoding\"><\/a><\/p>\n<p>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<ul>\n<li>\n<p>\u043c\u044b \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u043f\u043e \u0435\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u0441\u0442\u043e\u043b\u0431\u0446\u0443;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0438\u0437 \u043d\u0435\u0435 \u0441\u0442\u0440\u043e\u043a\u0443, \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u043d\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440. \u042d\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 (\u0437\u0430 \u0432\u044b\u0447\u0435\u0442\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430) \u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a:<\/p>\n<pre><code class=\"python\">\".........r\" \".........h\" \".........h\" \".........r\" \".........a\" \".........a\" \".........a\" \".........$\" \".........b\" \".........b\"<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u043d\u0430\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u044b. \u041c\u044b \u0437\u043d\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0441\u044b\u043b\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>\u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435;<\/p>\n<\/li>\n<li>\n<p>\u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u0437 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u0441\u043c. <a href=\"#%D0%9D%D0%B0%20%D1%87%D1%82%D0%BE%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">Encoding. \u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/a>).<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u0440\u0430\u0437\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u2013 \u044d\u0442\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446:<\/p>\n<pre><code class=\"python\">\"$........r\" \"a........h\" \"a........h\" \"a........r\" \"b........a\" \"b........a\" \"h........a\" \"h........$\" \"r........b\" \"r........b\"<\/code><\/pre>\n<p>\u0412 \u043d\u0430\u0448\u0438\u0445 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f\u0445 \u0432\u0435\u0441\u043e\u043c\u0443\u044e \u0440\u043e\u043b\u044c \u0441\u044b\u0433\u0440\u0430\u0435\u0442 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u2014 \u044d\u0442\u043e \u0432\u0441\u0435 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0439:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0412 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0430 <code>\"h........$\"<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u0432 \u0437\u0430\u0446\u0438\u043a\u043b\u0435\u043d\u043d\u043e\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u043e\u0441\u043b\u0435 <code>\"$\"<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 <code>\"h\"<\/code>: <code>\"....$h....\"<\/code><\/p>\n<\/li>\n<li>\n<p>\u041d\u043e \u0442\u043e\u0433\u0434\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 <code>\"$........r\"<\/code> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b: <code>\"$h.......r\"<\/code>\u00a0<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0432 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0435. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a\u0438\u0435 \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0430\u044e\u0442 \u0441\u0431\u043e\u0439 \u043d\u0430 \u043d\u0435\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u0445. \u041f\u043e\u0441\u043b\u0435 <code>\"a\"<\/code> \u043c\u043e\u0436\u0435\u0442 \u0438\u0434\u0442\u0438 <code>\"b\"<\/code> (\u0441\u0442\u0440\u043e\u043a\u0430 6), \u0430 \u043c\u043e\u0436\u0435\u0442 <code>\"h\"<\/code> (\u0441\u0442\u0440\u043e\u043a\u0430 7).<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0430\u044e\u0442 \u043d\u0430\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u0445 \u0438\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0440\u044f\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043a\u043e\u043b\u044c\u0446\u043e\u0432\u0430\u043d\u044b):<\/p>\n<pre><code class=\"cpp\">\"$........r\" \/\/ ....r$.... \"a........h\" \/\/ ....ha.... \"a........h\" \/\/ ....ha.... \"a........r\" \/\/ ....ra.... \"b........a\" \/\/ ....ab.... \"b........a\" \/\/ ....ab.... \"h........a\" \/\/ ....ah.... \"h........$\" \/\/ ....$h.... \"r........b\" \/\/ ....br.... \"r........b\" \/\/ ....br....<\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b:<\/p>\n<pre><code class=\"cpp\">\/\/ 1. non-sorted \u00a0 \u00a0 2. sorted \u00a0 \u00a0 \u00a0 \u00a0 3. with last column \u00a0 \"r$........\"\u00a0 \u00a0 \u00a0 \"$h........\"\u00a0 \u00a0 \u00a0 \"$h.......r\" \u00a0 \"ha........\"\u00a0 \u00a0 \u00a0 \"ab........\"\u00a0 \u00a0 \u00a0 \"ab.......h\" \u00a0 \"ha........\"\u00a0 \u00a0 \u00a0 \"ab........\"\u00a0 \u00a0 \u00a0 \"ab.......h\" \u00a0 \"ra........\"\u00a0 \u00a0 \u00a0 \"ah........\"\u00a0 \u00a0 \u00a0 \"ah.......r\" \u00a0 \"ab........\"\u00a0 ==&gt; \"br........\"\u00a0 ==&gt; \"br.......a\" \u00a0 \"ab........\"\u00a0 \u00a0 \u00a0 \"br........\"\u00a0 \u00a0 \u00a0 \"br.......a\" \u00a0 \"ah........\"\u00a0 \u00a0 \u00a0 \"ha........\"\u00a0 \u00a0 \u00a0 \"ha.......a\" \u00a0 \"$h........\"\u00a0 \u00a0 \u00a0 \"ha........\"\u00a0 \u00a0 \u00a0 \"ha.......$\" \u00a0 \"br........\"\u00a0 \u00a0 \u00a0 \"r$........\"\u00a0 \u00a0 \u00a0 \"r$.......b\" \u00a0 \"br........\"\u00a0 \u00a0 \u00a0 \"ra........\"\u00a0 \u00a0 \u00a0 \"ra.......b\"<\/code><\/pre>\n<p>\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435:<\/p>\n<ol>\n<li>\n<p>(non-sorted) \u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0434\u0432\u0438\u0433 \u0432\u043b\u0435\u0432\u043e \u043d\u0430 \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0441\u0442\u0440\u043e\u043a\u0430 <code>\"a........h\"<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 <code>\"ha........\"<\/code>. \u0412\u0430\u0436\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>\u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435, \u0438 \u043c\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u043a \u043d\u0438\u043c \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u043e \u043c\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u0435\u0441\u044c \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0440\u0438 \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p>(sorted) \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 (\u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430) \u2014 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>(with last column) \u0412 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043c\u0435\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0443\u0436\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u0438\u043d\u043e\u0439 3. \u0418 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0448\u0430\u0433\u0438, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u0441\u0442\u0440\u043e\u0438\u043c \u0432\u0441\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<pre><code class=\"cpp\">\"$habrahabr\" \"abr$habrah\" \"abrahabr$h\" \"ahabr$habr\" \"br$habraha\" \"brahabr$ha\" \"habr$habra\" \"habrahabr$\" \/\/ &lt;- \"habrahabr\" \"r$habrahab\" \"rahabr$hab\"<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443, \u043e\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0449\u0443\u044e\u0441\u044f \u043d\u0430 <code>\"$\"<\/code>, \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.<\/p>\n<h4>\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/h4>\n<p><a class=\"anchor\" name=\"%D0%9D%D0%B0%20%D1%87%D1%82%D0%BE%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B52\" id=\"\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u04352\"><\/a><\/p>\n<ol>\n<li>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u044f\u0441\u043d\u043e, \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u0438\u043c\u0432\u043e\u043b \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438: \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u043d\u0443\u043b\u0435\u0432\u044b\u043c\u00bb. \u041a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u0438\u043d\u043d\u0435\u0435 \u043d\u0430 \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a (<img decoding=\"async\" class=\"formula inline\" source=\"O(N^2)\" alt=\"O(N^2)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c9b\/3e9\/5f0\/c9b3e95f03dafcaee62edf4cc0bb3637.svg\" width=\"56\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c9b\/3e9\/5f0\/c9b3e95f03dafcaee62edf4cc0bb3637.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c9b\/3e9\/5f0\/c9b3e95f03dafcaee62edf4cc0bb3637.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u043e).<\/p>\n<\/li>\n<li>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b <img decoding=\"async\" class=\"formula inline\" source=\"N\" alt=\"N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/302\/59f\/523\/30259f523ac7cf8e56b6e3d86da9870b.svg\" width=\"17\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/302\/59f\/523\/30259f523ac7cf8e56b6e3d86da9870b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/302\/59f\/523\/30259f523ac7cf8e56b6e3d86da9870b.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0440\u0430\u0437 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 <img decoding=\"async\" class=\"formula inline\" source=\"N\" alt=\"N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/009\/d30\/b5f\/009d30b5f812f67190c92e269e171f61.svg\" width=\"17\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/009\/d30\/b5f\/009d30b5f812f67190c92e269e171f61.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/009\/d30\/b5f\/009d30b5f812f67190c92e269e171f61.svg 781w\" loading=\"lazy\" decode=\"async\"\/>; \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0437\u0430\u0439\u043c\u0435\u0442 \u0443 \u043d\u0430\u0441 <img decoding=\"async\" class=\"formula inline\" source=\"O(N^3 \\log N)\" alt=\"O(N^3 \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/734\/a75\/df7\/734a75df7c278d5c5b8cb0237c976ad6.svg\" width=\"104\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/734\/a75\/df7\/734a75df7c278d5c5b8cb0237c976ad6.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/734\/a75\/df7\/734a75df7c278d5c5b8cb0237c976ad6.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0435\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c (\u0441\u043f\u043e\u0439\u043b\u0435\u0440: \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f).<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u043e\u043b\u0431\u0446\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u043d\u0435\u0441\u0443\u0442 \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435, \u0447\u0435\u043c \u043f\u0440\u0430\u0432\u0435\u0435 \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b:<\/p>\n<ol>\n<li>\n<p>\u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043d\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0435 (\u0442\u0430\u043a\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438);<\/p>\n<\/li>\n<li>\n<p>\u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0438\u0437 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u044b (\u043f\u0443\u0441\u0442\u044c \u043e\u043d \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 <img decoding=\"async\" class=\"formula inline\" source=\"k\" alt=\"k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/198\/1d2\/4e8\/1981d24e864a3b34c8038b985c5ba3fa.svg\" width=\"10\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/198\/1d2\/4e8\/1981d24e864a3b34c8038b985c5ba3fa.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/198\/1d2\/4e8\/1981d24e864a3b34c8038b985c5ba3fa.svg 781w\" loading=\"lazy\" decode=\"async\"\/>) \u0443\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u0443\u0441\u043a\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u0438\u043d\u043e\u0439 <img decoding=\"async\" class=\"formula inline\" source=\"k\" alt=\"k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d25\/f20\/35f\/d25f2035fa9d6afbee5421b995b4e617.svg\" width=\"10\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d25\/f20\/35f\/d25f2035fa9d6afbee5421b995b4e617.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d25\/f20\/35f\/d25f2035fa9d6afbee5421b995b4e617.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u043c\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043e \u043a\u043e\u043d\u0446\u0430: \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u043c\u0435\u0435\u043c <code>\"abc\"<\/code>, <code>\"bcd\"<\/code>, <code>\"cda\"<\/code> \u0438 <code>\"dab\"<\/code>, \u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043a\u043b\u0435\u0438\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u0441\u043b\u043e\u0432\u043e \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0431\u0443\u043a\u0432 \u0431\u0443\u0434\u0435\u0442 <code>\"abcd\"<\/code> (\u0442\u043e\u0447\u043d\u0435\u0435, \u0432\u0441\u0435 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0434\u0432\u0438\u0433\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438);<\/p>\n<\/li>\n<li>\n<p>\u0438, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u042d\u0442\u043e \u043d\u0430\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u043c\u044b\u0441\u043b\u044c, \u0447\u0442\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u0430 \u0432 \u043f\u043b\u0430\u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h3>\u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430<\/h3>\n<p><a class=\"anchor\" name=\"%D0%98%D0%BC%D0%BF%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0\" id=\"\u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\"><\/a><\/p>\n<pre><code class=\"python\">\"\"\" \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u0435\u0437 \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u0439 \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c: - O(n^3 log n) \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 - O(n^2) \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \"\"\"  END = \"$\" DBG = True   def encode(text: str) -&gt; str:    assert END not in text, \"\u0432\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438\"     # \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a:    characters = list(text)    characters.append(END)    table = [characters.copy()]    for _ in range(len(characters) - 1):        first_char = characters.pop(0)        characters.append(first_char)        table.append(characters.copy())    table.sort()     if DBG:        print()        print(*[\"\".join(r) for r in table], sep=\"\\n\")        print()    # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446:    encoded = [row[-1] for row in table]    return \"\".join(encoded)   def decode(encoded: str) -&gt; str:    n = len(encoded)    last_column = list(encoded)    table = [\"\" for _ in range(n)]    # \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443:    for _ in range(n):        # \u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0440\u043e\u043a\u0438:        for i in range(n):            table[i] = last_column[i] + table[i]        table.sort()     # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c:    for row in table:        if row.endswith(END):            return row[:-1]    raise ValueError   if __name__ == \"__main__\":    input_str = input()  # \"habrahabr\"    encoded = encode(input_str)    if DBG:        print(encoded)    decoded = decode(encoded)    if DBG:        print(decoded)    assert input_str == decoded   <\/code><\/pre>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 BWT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h2>\n<p><a class=\"anchor\" name=\"%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20BWT%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82\" id=\"\u041f\u043e\u0447\u0435\u043c\u0443 BWT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\"><\/a><\/p>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043c\u044b \u0432 \u043b\u0443\u0447\u0448\u0438\u0445 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044f\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0431\u0438\u0432\u0430\u043b\u0438 \u0441\u0435\u0431\u0435 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443 \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0443\u043f\u0435\u043d\u0447\u0430\u0442\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044f \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 <strong>\u00ab<\/strong>\u0437\u0430\u0442\u043a\u043d\u0438\u0441\u044c-\u0438-\u0441\u0447\u0438\u0442\u0430\u0439<strong>\u00bb<\/strong>. \u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u043c\u0435\u043c \u0430\u043c\u0431\u0438\u0446\u0438\u043e\u0437\u043d\u0443\u044e \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043e\u0441\u043e\u0437\u043d\u0430\u0442\u044c \u0433\u043b\u0443\u0431\u0438\u043d\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u043c\u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044b? \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0447\u044c \u0438\u0434\u0435\u0442 \u043d\u0435 \u043e \u0442\u0435\u043a\u0441\u0442\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u043e \u043f\u043e\u0442\u043e\u043a\u0435 \u0431\u0430\u0439\u0442. \u041d\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043a\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041e\u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0441 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u043c\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0438. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0445 \u0432\u0441\u0442\u0430\u0432\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0432\u043e <code>\"BWT\"<\/code> \u2014 \u043e\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043d\u0435\u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"cpp\">... \/\/ \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"WT.......\u043e\u0447\u0435\u043d\u044c_\u043c\u043d\u043e\u0433\u043e_\u0442\u0435\u043a\u0441\u0442\u0430.......B\" \"WT.......\u043e\u0447\u0435\u043d\u044c_\u043c\u043d\u043e\u0433\u043e_\u0442\u0435\u043a\u0441\u0442\u0430.......B\" \"WT.......\u043e\u0447\u0435\u043d\u044c_\u043c\u043d\u043e\u0433\u043e_\u0442\u0435\u043a\u0441\u0442\u0430.......B\" ... \/\/ \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438<\/code><\/pre>\n<p>\u0421\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0431\u0443\u0434\u0443\u0442 \u0438 \u0442\u0430\u043a\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0437\u0430\u044e\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 <code>\"B\"<\/code> \u0438 <code>\"WT\"<\/code> \u0432 \u0441\u043b\u043e\u0432\u0435 <code>\"BWT\"<\/code>. \u0412\u0432\u0438\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b, \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0410 \u0437\u043d\u0430\u0447\u0438\u0442, \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u0441\u0435\u0440\u0438\u044e \u0438\u0437 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0445 <code>\"...BBBB...\"<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0430 <code>WT<\/code>, \u0442\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u043e\u043b\u0435\u0439 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0442\u044c, \u0447\u0442\u043e <code>...?WT...<\/code> &#8212; \u044d\u0442\u043e <code>...BWT...<\/code> (\u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u044d\u0442\u0438 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f).\u00a0<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0430\u0431\u0437\u0430\u0446\u0435\u043c \u0432\u044b\u0448\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0437\u043d\u0430\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0431\u0443\u043a\u0432\u044b BWT, \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442:<\/p>\n<pre><code class=\"cpp\">... \/\/ \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \"WT.......\u043e\u0447\u0435\u043d\u044c_\u043c\u043d\u043e\u0433\u043e_\u0442\u0435\u043a\u0441\u0442\u0430.......B\" \"WT.......\u043e\u0447\u0435\u043d\u044c_\u043c\u043d\u043e\u0433\u043e_\u0442\u0435\u043a\u0441\u0442\u0430.......?\" \"WT.......\u043e\u0447\u0435\u043d\u044c_\u043c\u043d\u043e\u0433\u043e_\u0442\u0435\u043a\u0441\u0442\u0430.......B\" ... \/\/ \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438<\/code><\/pre>\n<p>\u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0437\u043d\u0430\u043a\u0430 <code>?<\/code> \u0432 \u0441\u0435\u0440\u0438\u0438 <code>...BBBBB...<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u043a\u0430\u043a \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e. \u042d\u0442\u043e\u0442 \u0437\u043d\u0430\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438\u0437 <strong>\u00ab<\/strong>\u0431\u044d\u0448\u0435\u043a<strong>\u00bb<\/strong>, \u0432 \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c (\u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0441\u0442\u0440\u043e\u0433\u043e \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c) \u043c\u0435\u0441\u0442\u0435. \u0412 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0432\u0435\u0440\u0441\u0438\u0439 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u0438 \u043a\u0443\u0441\u043e\u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0437\u043d\u0430\u043a\u043e\u043c \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0432\u043e\u0442 \u0442\u0430\u043a: <code>BBBBBBBB\"BBB BBBBBBB?\"\"\"\"\"\"\/--eeLAAAAAA<\/code>.<\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u0431\u0443\u043a\u0432\u044b \u0438\u043b\u0438 \u0431\u0430\u0439\u0442\u044b) \u0432 BWT-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u0433\u0440\u0443\u043f\u043f\u044b \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0438\u0445 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043f\u0438 \u041c\u0430\u0440\u043a\u043e\u0432\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 BWT \u2014 \u0446\u0435\u043f\u044c \u041c\u0430\u0440\u043a\u043e\u0432\u0430 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430. \u0426\u0435\u043f\u0438 \u041c\u0430\u0440\u043a\u043e\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432. \u0412 \u043d\u0438\u0445 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432, \u0433\u0434\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u044b.\u00a0<\/p>\n<p>\u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0446\u0435\u043f\u0435\u0439 \u041c\u0430\u0440\u043a\u043e\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 (\u043f\u0440\u0430\u0432\u0434\u0430, \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u043c \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u043d\u0430 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u044f\u0445). \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c \u0432 \u0442\u0435\u043a\u0441\u0442\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>\"\u0438.\u0442.\"<\/code>. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 <code>\".\u0442.\u0434\"<\/code> \u0441 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e 83 % \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 <code>\".\u0442.\u043f\"<\/code> \u0441 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e 17 %. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432. \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044f\u0441\u044c \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0431\u0443\u043a\u0432\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"k\" alt=\"k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f8\/add\/33e\/7f8add33e55b1a3e018dfc585255e1ab.svg\" width=\"10\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f8\/add\/33e\/7f8add33e55b1a3e018dfc585255e1ab.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f8\/add\/33e\/7f8add33e55b1a3e018dfc585255e1ab.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0431\u0443\u043a\u0432.<\/p>\n<p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0430\u0441\u0442\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u0442 \u0434\u043b\u0438\u043d\u044b \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0430, \u0438 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0443\u0441\u0441\u043a\u0438\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0431\u0435\u0437 \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0431\u0443\u043a\u0432, \u043d\u043e \u0441 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438 \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u043f\u0440\u0435\u043f\u0438\u043d\u0430\u043d\u0438\u044f, \u0442\u043e \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 4 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0442\u044c \u043d\u0430\u043c <img decoding=\"async\" class=\"formula inline\" source=\"36^4=1679616\" alt=\"36^4=1679616\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/42a\/3c4\/02e\/42a3c402e64487dd3cb35148c41c5c35.svg\" width=\"121\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/42a\/3c4\/02e\/42a3c402e64487dd3cb35148c41c5c35.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/42a\/3c4\/02e\/42a3c402e64487dd3cb35148c41c5c35.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 (\u044d\u0442\u043e \u043e\u0446\u0435\u043d\u043a\u0430 \u0441\u0432\u0435\u0440\u0445\u0443, \u0442.\u043a. \u043d\u0435 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u0430\u0445).<\/p>\n<p>\u0410\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 BWT \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u041c\u0430\u0440\u043a\u043e\u0432\u0441\u043a\u0443\u044e \u0446\u0435\u043f\u044c.<\/p>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u0431\u044b \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e \u0435\u0433\u043e \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0443. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0443\u0431\u0440\u0430\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0432\u0441\u0435 \u0441\u0442\u043e\u043b\u0431\u0446\u044b, \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0442\u043e\u043b\u044c\u043a\u043e <img decoding=\"async\" class=\"formula inline\" source=\"k\" alt=\"k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/41e\/b6b\/692\/41eb6b692d60c97e2414e4dbeef057e7.svg\" width=\"10\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/41e\/b6b\/692\/41eb6b692d60c97e2414e4dbeef057e7.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/41e\/b6b\/692\/41eb6b692d60c97e2414e4dbeef057e7.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0435\u0440\u0432\u044b\u0445 \u0438 \u043e\u0434\u0438\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439, \u0438 \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0431\u044b \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u044b \u0446\u0435\u043f\u044c \u041c\u0430\u0440\u043a\u043e\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0431\u0443\u043a\u0432\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e <img decoding=\"async\" class=\"formula inline\" source=\"k\" alt=\"k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/054\/f14\/6be\/054f146be9ec7c93defb7e833e541d69.svg\" width=\"10\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/054\/f14\/6be\/054f146be9ec7c93defb7e833e541d69.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/054\/f14\/6be\/054f146be9ec7c93defb7e833e541d69.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c.\u00a0<\/p>\n<pre><code class=\"python\">\"$h.......r\" \u00a0 \u00a0 \"$h\": [(\"r\", 1.0)] # \u043f\u0435\u0440\u0435\u0434 \"$h\" \u0438\u0434\u0451\u0442 \"r\" \u0441 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e 1.0 \"ab.......h\" \u00a0 \u00a0 \"ab\": [(\"h\", 1.0)] \"ab.......h\" \"ah.......r\" \u00a0 \u00a0 \"ah\": [(\"r\", 1.0)] \"br.......a\" ==&gt; \"br\": [(\"a\", 1.0)] \"br.......a\" \"ha.......a\" \u00a0 \u00a0 \"ha\": [(\"a\", 0.5), (\"$\", 0.5)] \"ha.......$\" \"r$.......b\" \u00a0 \u00a0 \"r$\": [(\"b\", 1.0)] \"ra.......b\" \u00a0 \u00a0 \"ra\": [(\"b\", 1.0)]<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 \u043c\u044b \u043d\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 (\u0442.\u0435. \u0431\u0435\u0440\u0435\u043c \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441 \u0432\u0435\u0441\u044c \u0442\u0435\u043a\u0441\u0442), \u0442\u043e \u0446\u0435\u043f\u044c \u041c\u0430\u0440\u043a\u043e\u0432\u0430 \u0432\u044b\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u044b\u0434\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u0434\u043e\u043c \u043d\u0430\u043f\u0435\u0440\u0435\u0434: \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0431\u0443\u043a\u0432\u0443 \u043f\u043e \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430 \u043d\u0435\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442. \u0412 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043c\u044b \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0444\u0440\u0430\u0437\u044b, \u0441\u043b\u043e\u0432\u0430 \u0438 \u0431\u0443\u043a\u0432\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0435 BWT.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u0438 \u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u0435\u0434\u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430, \u043a\u043e\u0433\u0434\u0430 \u0447\u0438\u0442\u0430\u044e\u0442\/\u0441\u043b\u044b\u0448\u0430\u0442 \u0438\u0445. \u0418 \u0442\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u043e\u043d\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u044b BWT \u0441\u0442\u0440\u043e\u0438\u043b \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u043e \u044d\u0442\u043e \u0434\u0430\u043b\u043e \u0431\u044b \u043d\u0430\u043c \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0432 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 (\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0438\u0439 \u0438\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432).<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0432\u043e\u0434\u0443:<\/summary>\n<div class=\"spoiler__content\">\n<ol>\n<li>\n<p>\u0423\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0443\u044e \u043f\u0440\u0435\u0434\u043f\u043e\u0441\u044b\u043b\u043a\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0447\u0442\u0435\u043d\u0438\u044e. \u041d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0435\u0434\u0443\u0433\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c \u0441\u043b\u043e\u0432 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e: \u043c\u044b \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u043e \u043e\u0434\u043d\u0438\u043c \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c, \u0438 \u043d\u0430\u0448 \u043c\u043e\u0437\u0433 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043f\u043e \u043a\u043e\u0440\u0442\u0435\u0436\u0443 <code>(\u043f\u0435\u0440\u0432\u0430\u044f_\u0431\u0443\u043a\u0432\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f_\u0431\u0443\u043a\u0432\u0430, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f_\u0434\u043b\u0438\u043d\u0430, \u0441\u043e\u0441\u0442\u0430\u0432_\u0431\u0443\u043a\u0432_\u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435)<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u043f\u0438\u0441\u044c\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0430\u0442\u0430\u0432\u0438\u0437\u043c\u0430\u043c\u0438, \u0438 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c. \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0432 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u0430\u043b\u043e\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c\u043e \u0441 \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c (\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u0441 \u0435\u0433\u043e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9E%D1%80%D1%84%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F_%D0%B0%D0%BD%D0%B3%D0%BB%D0%B8%D0%B9%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0#%D0%A1%D0%BB%D0%BE%D0%B2%D0%B0_%D1%81_%C2%ABough%C2%BB\" rel=\"noopener noreferrer nofollow\">ough-\u0441\u043b\u043e\u0432\u0430\u043c\u0438<\/a>).\u00a0<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u043b BWT \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0443\u0441\u0441\u043a\u0438\u0445 \u0438 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u0430\u0445. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u0443\u044e \u0434\u043b\u0438\u043d\u0443 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0438\u0439 \u0438\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u0438\u043d\u043d\u0435\u0435 \u0434\u0432\u0443\u0445. \u041d\u043e \u043c\u043e\u0438 \u043e\u043f\u044b\u0442\u044b \u043d\u0435 \u0432\u044b\u044f\u0432\u0438\u043b\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p><a class=\"anchor\" name=\"%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\" id=\"\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\"><\/a><\/p>\n<p>\u041a\u0430\u043a \u043c\u044b \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u0438 <a href=\"#%D0%98%D0%BC%D0%BF%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0448\u0435<\/a>, \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0435\u0447\u0430\u043b\u044c\u043d\u0430\u044f. \u0415\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u0434 \u043d\u0430\u0438\u0432\u043d\u043e\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442 \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0435\u043a\u0441\u0442 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0431\u0435\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a), \u0442\u043e \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u043f\u0435\u0442\u044c \u043f\u043e\u043f\u0438\u0442\u044c \u0447\u0430\u0439, \u043d\u043e \u0438 \u0434\u0430\u0436\u0435 \u043f\u043e\u0440\u0430\u0437\u043c\u044b\u0448\u043b\u044f\u0442\u044c \u043d\u0430\u0434 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_%D0%BE%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0442\u0435\u043e\u0440\u0438\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c\u043e\u0441\u0442\u0438<\/a>. \u0410 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u044b \u043c\u0435\u043d\u0435\u0435 \u043e\u0441\u043d\u0430\u0449\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u0434\u0430\u0436\u0435 \u0440\u0438\u0441\u043a\u0443\u044e\u0442 \u0441\u043b\u043e\u0432\u0438\u0442\u044c <code>OutOfMemoryError<\/code>.<\/p>\n<p>\u0417\u043b\u043e\u043f\u044b\u0445\u0430\u0442\u0435\u043b\u0438 \u0441\u043a\u0430\u0436\u0443\u0442, \u0447\u0442\u043e \u0432\u0441\u0435\u043c\u0443 \u0432\u0438\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440 \u044f\u0437\u044b\u043a\u0430. \u0414\u0435\u0441\u043a\u0430\u0442\u044c, \u0447\u0435\u0433\u043e \u0435\u0449\u0435 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442 \u043f\u0438\u0442\u043e\u043d\u0430. \u042d\u0442\u043e\u0442 \u044f\u0437\u044b\u043a \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<p>\u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0440\u043e\u043b\u044c \u0438\u0433\u0440\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0415\u0435 \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e \u2014 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u044c. \u0415\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u2014 \u043e\u043d\u0430, \u043c\u044f\u0433\u043a\u043e \u0441\u043a\u0430\u0436\u0435\u043c, \u043d\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"O(N^2)\" alt=\"O(N^2)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5fc\/3cf\/06a\/5fc3cf06ac713c07774342d53a9cd479.svg\" width=\"56\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5fc\/3cf\/06a\/5fc3cf06ac713c07774342d53a9cd479.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5fc\/3cf\/06a\/5fc3cf06ac713c07774342d53a9cd479.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u0430\u043c\u044f\u0442\u0438, \u0438 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e. \u041a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0445\u0443\u0436\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u0432\u043e\u0448\u043b\u043e \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0443 \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0433\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u0430\u043c\u0438 RAM \u0432 \u0443\u0433\u043e\u0434\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u043c \u0432\u044b\u0439\u0434\u0435\u0442 \u0431\u043e\u043a\u043e\u043c. \u041a\u0432\u0430\u0434\u0440\u0430\u0442 \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438 \u2014 \u044d\u0442\u043e \u0443\u0433\u0440\u043e\u0437\u0430 \u043b\u044e\u0431\u043e\u043c\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0443 RAM. \u0415\u0441\u043b\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 128 KiB (<img decoding=\"async\" class=\"formula inline\" source=\"2^{17}\" alt=\"2^{17}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/031\/c70\/a8e\/031c70a8e8d8aca635dc4403e9c09e2a.svg\" width=\"25\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/031\/c70\/a8e\/031c70a8e8d8aca635dc4403e9c09e2a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/031\/c70\/a8e\/031c70a8e8d8aca635dc4403e9c09e2a.svg 781w\" loading=\"lazy\" decode=\"async\"\/>), \u0442\u043e \u0435\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u0443\u0436\u0435 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c 16 GiB (<img decoding=\"async\" class=\"formula inline\" source=\"2^{34}\" alt=\"2^{34}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c82\/4f4\/7eb\/c824f47ebe37147d4aa20bcd14eb2455.svg\" width=\"25\" height=\"21\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c82\/4f4\/7eb\/c824f47ebe37147d4aa20bcd14eb2455.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c82\/4f4\/7eb\/c824f47ebe37147d4aa20bcd14eb2455.svg 781w\" loading=\"lazy\" decode=\"async\"\/>) (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e 1 \u0441\u0438\u043c\u0432\u043e\u043b = 1 \u0431\u0430\u0439\u0442).<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"N\" alt=\"N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/50e\/534\/45e\/50e53445e7c6329e35d622e734ad7718.svg\" width=\"17\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/50e\/534\/45e\/50e53445e7c6329e35d622e734ad7718.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/50e\/534\/45e\/50e53445e7c6329e35d622e734ad7718.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u0438\u043d\u043e\u0439 \u0432 <img decoding=\"async\" class=\"formula inline\" source=\"N\" alt=\"N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1c5\/e7b\/b0c\/1c5e7bb0cdfc60a46875e233c2c9f749.svg\" width=\"17\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1c5\/e7b\/b0c\/1c5e7bb0cdfc60a46875e233c2c9f749.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1c5\/e7b\/b0c\/1c5e7bb0cdfc60a46875e233c2c9f749.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u044d\u0442\u043e <img decoding=\"async\" class=\"formula inline\" source=\"O(N \\cdot N \\log N) = O(N^2 \\log N)\" alt=\"O(N \\cdot N \\log N) = O(N^2 \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cbf\/f5a\/f29\/cbff5af292d585c12903df967dbb922b.svg\" width=\"256\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cbf\/f5a\/f29\/cbff5af292d585c12903df967dbb922b.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cbf\/f5a\/f29\/cbff5af292d585c12903df967dbb922b.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0410 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u0443 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c <img decoding=\"async\" class=\"formula inline\" source=\"N\" alt=\"N\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a8\/05a\/ff8\/3a805aff89d2f8f585a31729c943bf38.svg\" width=\"17\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a8\/05a\/ff8\/3a805aff89d2f8f585a31729c943bf38.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a8\/05a\/ff8\/3a805aff89d2f8f585a31729c943bf38.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0440\u0430\u0437, \u0438 \u0442\u043e\u0433\u0434\u0430 \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0443\u0448\u0438\u0442\u0435 \u0441\u0432\u0435\u0442: <img decoding=\"async\" class=\"formula inline\" source=\"O(N^3 \\log N)\" alt=\"O(N^3 \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b62\/671\/ce5\/b62671ce5ee5552f596a6bf60da36789.svg\" width=\"104\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b62\/671\/ce5\/b62671ce5ee5552f596a6bf60da36789.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b62\/671\/ce5\/b62671ce5ee5552f596a6bf60da36789.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u043e \u0435\u0441\u0442\u044c, \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0434\u0432\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0430 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u2014 \u0437\u0430\u0439\u0442\u0438 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0433\u043b\u0443\u0431\u0436\u0435. \u0418 \u044d\u0442\u043e \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f <img decoding=\"async\" class=\"formula inline\" source=\"O(N\/k)\" alt=\"O(N\/k)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/564\/e52\/089\/564e52089d8a0cb1465c84a6c2565e86.svg\" width=\"67\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/564\/e52\/089\/564e52089d8a0cb1465c84a6c2565e86.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/564\/e52\/089\/564e52089d8a0cb1465c84a6c2565e86.svg 781w\" loading=\"lazy\" decode=\"async\"\/>, \u0433\u0434\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <img decoding=\"async\" class=\"formula inline\" source=\"k\" alt=\"k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7e3\/ffd\/daf\/7e3ffddaf65a4dc24322792bafc7afd6.svg\" width=\"10\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7e3\/ffd\/daf\/7e3ffddaf65a4dc24322792bafc7afd6.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7e3\/ffd\/daf\/7e3ffddaf65a4dc24322792bafc7afd6.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u2014 \u044d\u0442\u043e \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0437\u0430\u0445\u043e\u0434\u0430. \u041d\u043e O-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0435\u0442 \u0434\u0435\u043b\u0430 \u0434\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u044b\u0445 \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u0435\u0439.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0438 \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u0435\u0433\u043e \u0441\u043e \u0441\u0442\u0440\u043e\u043a \u043d\u0430 \u0431\u0430\u0439\u0442\u044b.<\/p>\n<h3>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/h3>\n<p><a class=\"anchor\" name=\"%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%20%D0%BF%D1%80%D0%B8%20%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8\" id=\"\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438\"><\/a><\/p>\n<p>\u041a\u0430\u043a \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0434\u0432\u0438\u0433\u043e\u0432, \u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u043d\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u0437\u0440\u044f\u0434\u043d\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043d\u0435\u0439 \u2014 \u044d\u0442\u043e \u0434\u0435-\u0444\u0430\u043a\u0442\u043e \u043e\u0434\u043d\u0430 \u0438 \u0442\u0430 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0430, \u043d\u043e \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0434\u0432\u0438\u0433\u0430:<\/p>\n<pre><code class=\"cpp\">\"habrahabr$\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 0 \"abrahabr$h\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 1 \"brahabr$ha\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 2 \"rahabr$hab\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 3 \"ahabr$habr\"\u00a0 \u00a0 = \u00a0 \"habrahabr$\" \u00a0 +\u00a0 \u00a0 4 \"habr$habra\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 5 \"abr$habrah\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 6 \"br$habraha\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 7 \"r$habrahab\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 8 \"$habrahabr\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 9<\/code><\/pre>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0430 \u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f (\u0440\u0430\u0434\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438) \u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 (\u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u043e\u043b\u043e\u043d\u043a\u0443). \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"python\">from typing import Self   def encode(text: str) -&gt; str:    \"\"\"\u0412\u0435\u0440\u0441\u0438\u044f BWT-\u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 O(N) \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"     array = list(text)    array.append(\"$\")    array_size = len(array)     class ComparableRotation:  # \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441        def __init__(self, shift: int) -&gt; None:            self.shift = shift         # \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 `[]`        def __getitem__(self, index: int) -&gt; str:            return array[(index + self.shift) % array_size]         # \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 `&lt;`        def __lt__(self, other: Self) -&gt; bool:            for i in range(array_size):                if self[i] &lt; other[i]:                    return True                elif self[i] &gt; other[i]:                    return False                elif self[i] == other[i]:                    continue            return False     table = [ComparableRotation(shift) for shift in range(array_size)]    table.sort()     # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446:    encoded = [row[-1] for row in table]    return \"\".join(encoded) <\/code><\/pre>\n<h3>\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430<\/h3>\n<p><a class=\"anchor\" name=\"%D0%98%D0%B7%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%D1%81%D1%8F%20%D0%BE%D1%82%20%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B0\" id=\"\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430\"><\/a><\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u2014 \u0431\u044b\u0442\u044c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412\u0435\u0434\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 BWT \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u043d\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0430 \u0435\u0433\u043e \u0437\u0430\u043a\u043e\u043b\u044c\u0446\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e. \u0418 \u043c\u044b \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u0435\u043c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u044d\u0442\u043e \u043a\u043e\u043b\u044c\u0446\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0440\u0432\u0430\u0442\u044c. \u0422\u043e\u0447\u043d\u0435\u0435, \u0432 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c (\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c). \u0421 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0440\u0430\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430 \u043d\u0435\u0433\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 <code>ComparableRotation<\/code> \u043c\u044b \u0438 \u0442\u0430\u043a \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432 \u0442\u0435\u043a\u0441\u0442\u0435: \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>ComparableRotation<\/code> \u0441\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c <code>0<\/code>.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043d\u0435\u0439.<\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">from typing import Self   def encode(text: str) -&gt; tuple[str, int]:    \"\"\"\u0412\u0435\u0440\u0441\u0438\u044f BWT-\u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 O(N) \u043f\u0430\u043c\u044f\u0442\u0438\"\"\"     array = list(text)    array.append(\"$\")    array_size = len(array)     class ComparableRotation:  # \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441        def __init__(self, shift: int) -&gt; None:            self.shift = shift         # \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 `[]`        def __getitem__(self, index: int) -&gt; str:            return array[(index + self.shift) % array_size]         # \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 `&lt;`        def __lt__(self, other: Self) -&gt; bool:            for i in range(array_size):                if self[i] &lt; other[i]:                    return True                elif self[i] &gt; other[i]:                    return False                elif self[i] == other[i]:                    continue            return False     table = [ComparableRotation(shift) for shift in range(array_size)]    table.sort()     # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446:    encoded = []    origin = -1    for i, row in enumerate(table):        if row.shift == 0:            origin = i  # \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0441\u0434\u0432\u0438\u0433\u043e\u043c        encoded.append(row[-1])    return (\"\".join(encoded), origin) <\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0443\u0436\u0435 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 (\u043f\u043e\u043b\u043d\u0430\u044f \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438).<\/p>\n<h3>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p><a class=\"anchor\" name=\"%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B5%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\" id=\"\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\"><\/a><\/p>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0438\u0437 \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435. \u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u0441\u0438\u044e \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b51\/622\/ab4\/b51622ab4d5456e7ab572a3cff746b4b.png\" width=\"158\" height=\"292\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b51\/622\/ab4\/b51622ab4d5456e7ab572a3cff746b4b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b51\/622\/ab4\/b51622ab4d5456e7ab572a3cff746b4b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0417\u0434\u0435\u0441\u044c \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, \u0432 \u043a\u0430\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u043f\u0430\u043b \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435. \u0412 \u0441\u043b\u043e\u0432\u0435 <code>\"habrahabr\"<\/code> \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 (\u0442.\u0435. <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A3%D1%81%D1%82%D0%BE%D0%B9%D1%87%D0%B8%D0%B2%D0%B0%D1%8F_%D1%81%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/a>).<\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%94%D0%B2%D1%83%D0%B4%D0%BE%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B3%D1%80%D0%B0%D1%84\" rel=\"noopener noreferrer nofollow\">\u0434\u0432\u0443\u0434\u043e\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0444<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: <strong>\u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439 \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0448\u0430\u0433\u0430 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/strong>. \u0412\u043e\u0442, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0434\u0432\u0443\u0434\u043e\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0448\u0430\u0433\u0430:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b21\/a1b\/12c\/b21a1b12c8e863997e8612fb8c770e95.png\" width=\"174\" height=\"290\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b21\/a1b\/12c\/b21a1b12c8e863997e8612fb8c770e95.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b21\/a1b\/12c\/b21a1b12c8e863997e8612fb8c770e95.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<details class=\"spoiler\">\n<summary>\u0412\u043e\u043e\u0431\u0449\u0435 \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0433\u0440\u0430\u0444 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f\u2026<\/summary>\n<div class=\"spoiler__content\">\n<p>\u2026\u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u0442\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438\u0445 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0440\u0443\u0433 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u0430? \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u044b\u043b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u0435\u043d \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0435, \u0438 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u0442\u043e\u0436\u0435. \u041d\u043e \u0433\u0434\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f, \u0447\u0442\u043e \u043d\u0430 \u0448\u0430\u0433\u0435 <img decoding=\"async\" class=\"formula inline\" source=\"k\" alt=\"k\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ec\/f51\/ff8\/6ecf51ff8e9df364969dac08d547c06a.svg\" width=\"10\" height=\"17\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ec\/f51\/ff8\/6ecf51ff8e9df364969dac08d547c06a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ec\/f51\/ff8\/6ecf51ff8e9df364969dac08d547c06a.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0431\u0443\u043a\u0432 \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f?<\/p>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u044d\u0442\u0430 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u044b\u043b\u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0412\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">    1.             2.              3. ...            ...            ...   \"aaa...d\"      \"daaa...\"       \"daaa...\" \"aab...e\"  =&gt;  \"eaab...\"  =&gt;   \"daac...\" \"aac...d\"      \"daac...\"       \"eaab...\" ...            ...             ...       <\/code><\/pre>\n<p>\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u0448\u0430\u0433\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0434\u0432\u0438\u0433\u043e\u0432) \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0432\u0435 \u0431\u0443\u043a\u0432\u044b <code>d<\/code> \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 (\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0432\u043b\u0435\u0432\u043e (\u0442\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443).<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438. \u0411\u0443\u043a\u0432\u044b <code>d<\/code> \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b\u0438 \u0441\u0432\u043e\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0434\u0440\u0443\u0433 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u0430, \u0442.\u043a. <code>\"aaa\"<\/code> \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c <code>\"aac\"<\/code>.<\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/details>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u044b\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0434\u0432\u0443\u0434\u043e\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0444, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443. \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/64d\/889\/fb6\/64d889fb6180b042dfc093f80eb12ddc.png\" width=\"174\" height=\"298\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/64d\/889\/fb6\/64d889fb6180b042dfc093f80eb12ddc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/64d\/889\/fb6\/64d889fb6180b042dfc093f80eb12ddc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435:<\/p>\n<ol>\n<li>\n<p>\u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 (\u0432 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u0431\u0435\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0438\u043c\u0432\u043e\u043b \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443). \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0435\u043c\u0443 \u0431\u0443\u043a\u0432\u0430 \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 \u043d\u0438\u043c (\u0441\u0442\u0440\u043e\u043a\u0430 <code>\"h........$\"<\/code> \u0442\u0440\u0435\u0442\u044c\u044f \u0441\u043d\u0438\u0437\u0443).<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0433\u0440\u0430\u0444\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432, \u0431\u0443\u043a\u0432\u0430 <code>h<\/code> \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0442\u0440\u0435\u0442\u0435\u0439 \u0441\u043d\u0438\u0437\u0443 \u0441\u0442\u0440\u043e\u043a\u0438 \u2014 \u044d\u0442\u043e \u0431\u0443\u043a\u0432\u0430 <code>h<\/code> \u0432 \u043a\u043e\u043d\u0446\u0435 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u0442\u0440\u043e\u043a\u0438 (\u043a\u043e\u0442\u043e\u0440\u0430\u044f <code>\"a........h\"<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u0417\u0430 \u043d\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u043a\u0432\u0430 <code>a<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c <code>\"ha...\"<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0433\u0440\u0430\u0444\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432, <code>a<\/code> \u0438\u0437 \u043d\u0430\u0447\u0430\u043b\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u2014 \u044d\u0442\u043e <code>a<\/code> \u0438\u0437 \u043a\u043e\u043d\u0446\u0430 \u0448\u0435\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (<code>\"b........a\"<\/code>). \u0417\u0430 \u043d\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u043a\u0432\u0430 <code>b<\/code> ( <code>\"hab...\"<\/code>).<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0448\u0430\u0433 \u0435\u0449\u0435 6 \u0440\u0430\u0437.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0434\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0446\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u2014 \u044d\u0442\u043e \u043d\u0430\u0448\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e (<img decoding=\"async\" class=\"formula inline\" source=\"O(N \\log N)\" alt=\"O(N \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da5\/2f9\/8bf\/da52f98bfaf8fe0f41c5db7b4c89085c.svg\" width=\"95\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da5\/2f9\/8bf\/da52f98bfaf8fe0f41c5db7b4c89085c.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/da5\/2f9\/8bf\/da52f98bfaf8fe0f41c5db7b4c89085c.svg 781w\" loading=\"lazy\" decode=\"async\"\/>). \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <img decoding=\"async\" class=\"formula inline\" source=\"O(N)\" alt=\"O(N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a1\/35c\/06b\/8a135c06b284044be064fa9d1b831a8a.svg\" width=\"47\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a1\/35c\/06b\/8a135c06b284044be064fa9d1b831a8a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8a1\/35c\/06b\/8a135c06b284044be064fa9d1b831a8a.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0447\u0442\u043e \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e, \u0442.\u043a. \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0436\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"O(N)\" alt=\"O(N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/57a\/905\/d3f\/57a905d3fbe200b4f1eb88b93f59eaee.svg\" width=\"47\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/57a\/905\/d3f\/57a905d3fbe200b4f1eb88b93f59eaee.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/57a\/905\/d3f\/57a905d3fbe200b4f1eb88b93f59eaee.svg 781w\" loading=\"lazy\" decode=\"async\"\/>).<\/p>\n<p>\u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"python\">def decode(encoded: str, origin: int) -&gt; str:    n = len(encoded)    permutation = list(range(n))    permutation.sort(key=lambda i: encoded[i])  # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443     current = origin    decoded = []    for _ in range(n):        current = permutation[current]  # \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430        decoded.append(encoded[current])    return \"\".join(decoded) <\/code><\/pre>\n<h3>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/h3>\n<p><a class=\"anchor\" name=\"%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8%20%D0%BF%D1%80%D0%B8%20%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8\" id=\"\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438\"><\/a><\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 <strong>\u00ab<\/strong>\u0431\u0443\u0442\u044b\u043b\u043e\u0447\u043d\u043e\u0435 \u0433\u043e\u0440\u043b\u044b\u0448\u043a\u043e<strong>\u00bb<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0443\u043f\u0440\u0435\u043c\u0441\u044f \u2014 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u043e\u0434\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043c\u043e\u043c 100 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 (\u0432\u043f\u043e\u043b\u043d\u0435 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438), \u0442\u043e \u0435\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 (\u043d\u0430 \u043c\u043e\u0451\u043c \u0441\u043a\u0440\u043e\u043c\u043d\u043e\u043c AMD Ryzen 5 PRO 3500U \u2014 \u043e\u043a\u043e\u043b\u043e \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u044f\u0434\u0440\u0435). \u0422\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0447\u0438\u043d.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u0431\u044a\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u043c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043e\u043c, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 100 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0442\u044c 100 000 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a. \u0418 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u043d\u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438: <img decoding=\"async\" class=\"formula inline\" source=\"O(N \\log N)\" alt=\"O(N \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/95d\/730\/be3\/95d730be3ae6ecb3cea6b606612a04c9.svg\" width=\"95\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/95d\/730\/be3\/95d730be3ae6ecb3cea6b606612a04c9.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/95d\/730\/be3\/95d730be3ae6ecb3cea6b606612a04c9.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.<\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0430 \u043d\u0435 \u0447\u0438\u0441\u043b\u0430. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432 (\u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a) \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"O(N)\" alt=\"O(N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/776\/78c\/b78\/77678cb782799d3f2d57e6873216ee2d.svg\" width=\"47\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/776\/78c\/b78\/77678cb782799d3f2d57e6873216ee2d.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/776\/78c\/b78\/77678cb782799d3f2d57e6873216ee2d.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0437\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0442\u0438\u043f\u0430 Radix Sort. \u0421\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <img decoding=\"async\" class=\"formula inline\" source=\"O(N^2 \\log N)\" alt=\"O(N^2 \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc7\/6b0\/3a1\/fc76b03a11ceffc8b2df8447ebf4622a.svg\" width=\"104\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc7\/6b0\/3a1\/fc76b03a11ceffc8b2df8447ebf4622a.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fc7\/6b0\/3a1\/fc76b03a11ceffc8b2df8447ebf4622a.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u0422\u0443\u0442, \u043f\u0440\u0430\u0432\u0434\u0430, \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u0442\u0440\u043e\u043a \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c \u0434\u043e \u043a\u043e\u043d\u0446\u0430 (\u0435\u0441\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u0441\u0443\u043d\u0435\u043c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435). \u0412 \u043c\u043e\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u0445 \u043d\u0430 \u0431\u043b\u043e\u043a\u0430\u0445 \u0438\u0437 100 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 23 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f (23 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043e\u0431\u0435\u0438\u0445 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438), \u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u0438 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438. \u0422\u043e \u0435\u0441\u0442\u044c, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 <img decoding=\"async\" class=\"formula inline\" source=\"O((0.000001  \\cdot N)  N \\log N)\" alt=\"O((0.000001  \\cdot N)  N \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f8a\/837\/9f5\/f8a8379f5718c4aa3f49741c7a7da457.svg\" width=\"214\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f8a\/837\/9f5\/f8a8379f5718c4aa3f49741c7a7da457.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f8a\/837\/9f5\/f8a8379f5718c4aa3f49741c7a7da457.svg 781w\" loading=\"lazy\" decode=\"async\"\/>. \u041d\u043e \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u041e-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 <img decoding=\"async\" class=\"formula inline\" source=\"O(N^2 \\log N)\" alt=\"O(N^2 \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d29\/439\/3a1\/d294393a1dee80b2c859ff690491e018.svg\" width=\"104\" height=\"25\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d29\/439\/3a1\/d294393a1dee80b2c859ff690491e018.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d29\/439\/3a1\/d294393a1dee80b2c859ff690491e018.svg 781w\" loading=\"lazy\" decode=\"async\"\/>.\u00a0<\/p>\n<p>\u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Python \u2014 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0418 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043e\u043d \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u043e\u043c\u0443 \u044f\u0437\u044b\u043a\u0443. \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0442 Python \u043a\u0430\u043a \u044f\u0437\u044b\u043a \u0432 10-100 \u0440\u0430\u0437 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u0447\u0435\u043c C.<\/p>\n<p>\u0427\u0442\u043e \u0436\u0435 \u0434\u0435\u043b\u0430\u0442\u044c? \u0422\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u044e \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u044b\u043c<s>, \u043a\u0430\u043a, \u0432\u043f\u0440\u043e\u0447\u0435\u043c, \u0438 \u0441\u0430\u043c\u0430 \u0438\u0434\u0435\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043e\u0440 \u043d\u0430 Python<\/s>.\u00a0<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/pypy.org\/\" rel=\"noopener noreferrer nofollow\">pypy<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0446\u0435\u043d\u043e\u0439 \u0431\u00f3\u043b\u044c\u0448\u0438\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438; \u0432 \u043c\u043e\u0438\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 pypy \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 2.5 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435). \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0434\u0435\u0440 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b.<\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 <a href=\"https:\/\/zork.net\/~st\/jottings\/sais.html\" rel=\"noopener noreferrer nofollow\">\u0445\u0438\u0442\u0440\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043d\u044b\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e <img decoding=\"async\" class=\"formula inline\" source=\"O(N)\" alt=\"O(N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e60\/4f8\/0da\/e604f80da39ed5131c749c22b55f79fb.svg\" width=\"47\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e60\/4f8\/0da\/e604f80da39ed5131c749c22b55f79fb.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e60\/4f8\/0da\/e604f80da39ed5131c749c22b55f79fb.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 <img decoding=\"async\" class=\"formula inline\" source=\"O(N)\" alt=\"O(N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0bf\/0d8\/7ed\/0bf0d87ed7d1f16284b5e753bb6f1046.svg\" width=\"47\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0bf\/0d8\/7ed\/0bf0d87ed7d1f16284b5e753bb6f1046.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0bf\/0d8\/7ed\/0bf0d87ed7d1f16284b5e753bb6f1046.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u043f\u043e \u043f\u0430\u043c\u044f\u0442\u0438. \u0422\u0430\u043a\u043e\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438, \u0430 \u0441\u0434\u0432\u0438\u0433\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0442\u0443\u0442 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0432\u0435\u0440\u043a\u0438\u043b\u043b. \u041d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u043b\u043e\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0430\u0441\u0442\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a <img decoding=\"async\" class=\"formula inline\" source=\"O(N \\log N)\" alt=\"O(N \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4fa\/a87\/781\/4faa877813907989eeeec1da063b6da8.svg\" width=\"95\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4fa\/a87\/781\/4faa877813907989eeeec1da063b6da8.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4fa\/a87\/781\/4faa877813907989eeeec1da063b6da8.svg 781w\" loading=\"lazy\" decode=\"async\"\/> (\u0434\u0430, \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043e\u0442\u043c\u0430\u0445\u043d\u0443\u043b\u0441\u044f \u043e\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0436\u0435 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0430\u043c\u0438 \u0432\u044b\u0448\u0435, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <img decoding=\"async\" class=\"formula inline\" source=\"0.000001\" alt=\"0.000001\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/937\/572\/9f1\/9375729f1fbda1afcbba374318ff19f5.svg\" width=\"73\" height=\"16\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/937\/572\/9f1\/9375729f1fbda1afcbba374318ff19f5.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/937\/572\/9f1\/9375729f1fbda1afcbba374318ff19f5.svg 781w\" loading=\"lazy\" decode=\"async\"\/> \u0432 <img decoding=\"async\" class=\"formula inline\" source=\"O((0.000001 \\cdot N)  N \\log N)\" alt=\"O((0.000001 \\cdot N)  N \\log N)\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ec\/d75\/efd\/7ecd75efd6c179a848ddd92a83e4fad0.svg\" width=\"214\" height=\"22\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ec\/d75\/efd\/7ecd75efd6c179a848ddd92a83e4fad0.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ec\/d75\/efd\/7ecd75efd6c179a848ddd92a83e4fad0.svg 781w\" loading=\"lazy\" decode=\"async\"\/>).<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 <code>cProfile<\/code>, \u0442\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f (\u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435: 1.471 \u0438\u0437 2.316 \u0441\u0435\u043a\u0443\u043d\u0434):<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ce\/1c5\/17e\/0ce1c517ef3b77f60d561a0d7eae9ef7.png\" width=\"583\" height=\"54\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/0ce\/1c5\/17e\/0ce1c517ef3b77f60d561a0d7eae9ef7.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0ce\/1c5\/17e\/0ce1c517ef3b77f60d561a0d7eae9ef7.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412\u0441\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>__lt__<\/code> \u043a\u043b\u0430\u0441\u0441\u0430 <code>ComparableRotation<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u0418\u0441\u0445\u043e\u0434\u043d\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def __lt__(self, other: Self) -&gt; bool:    for i in range(array_size):        if self[i] &lt; other[i]:            return True        elif self[i] &gt; other[i]:            return False        elif self[i] == other[i]:            continue    return False<\/code><\/pre>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def __lt__(self, other: Self) -&gt; bool:    si = self.shift    oi = other.shift    for i in range(array_size):        s = array[si]        o = array[oi]        if s &lt; o:            return True        elif s &gt; o:            return False        si += 1        oi += 1        if si == array_size:            si = 0        if oi == array_size:            oi = 0    return False <\/code><\/pre>\n<p>\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 3 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041f\u043e\u043b\u0430\u0433\u0430\u044e, \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>array<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>list<\/code>), \u0430 \u043d\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <code>self<\/code> \u0438 <code>other<\/code>, \u0447\u044c\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0435.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bucket_sort\" rel=\"noopener noreferrer nofollow\">Bucket sort (\u0431\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \/ \u043a\u043e\u0440\u0437\u0438\u043d\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430)<\/a> \u2014 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0438\u0434\u043e\u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0437\u0430 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0430\u043c\u0438 \u0432\u044b\u0448\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>\u0427\u0438\u0441\u0442\u0430\u044f \u0431\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0445\u0443\u0434\u0448\u0438\u0435, \u0447\u0435\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0438\u0442\u043e\u043d\u043e\u0432\u0441\u043a\u0438\u0439 sort. \u041d\u043e \u0435\u0441\u043b\u0438 \u0438\u0445 \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435. \u0418\u0434\u0435\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0445 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0431\u043b\u043e\u0447\u043d\u043e\u0439 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0445\u0441\u044f \u00ab\u043a\u043e\u0440\u0437\u0438\u043d\u00bb \u0443\u0436\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c sort. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0434\u0432\u0443\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e (x2) \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438.<\/p>\n<pre><code class=\"python\">MAX_DEPTH = 6 # MAX_DEPTH \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e  def _sort( rows: list[Any], depth: int = 0) -&gt; list[Any]:    if depth == MAX_DEPTH: # \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438        rows.sort()  # \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438        return rows     buckets: dict[Any, list[Any]] = {}    for row in rows:        key = row[depth]        if key not in buckets:            buckets[key] = []        buckets[key].append(row)    ans: list[Any] = []    for key in sorted(buckets.keys()):        # \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u043a\u043e\u0440\u0437\u0438\u043d        buckets[key] = _sort(buckets[key], depth + 1)        ans.extend(buckets[key])    return ans<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432 \u0441\u043e\u0432\u043e\u043a\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u0432 3*2=6 \u0440\u0430\u0437. \u0422.\u0435. \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u0432 100 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0431\u0443\u0434\u0435\u043c \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435 1,5 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u0430 0,25 \u0441\u0435\u043a\u0443\u043d\u0434\u044b.<\/p>\n<p>\u041f\u043b\u044e\u0441, \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 5\u201315 % \u0434\u0430\u0441\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e \u0441\u0442\u0440\u043e\u043a \u043d\u0430 \u0431\u0430\u0439\u0442\u044b.<\/p>\n<h3>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438<\/h3>\n<p><a class=\"anchor\" name=\"%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%B4%20%D1%81%D0%BE%20%D0%B2%D1%81%D0%B5%D0%BC%D0%B8%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%D0%BC%D0%B8\" id=\"\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438\"><\/a><\/p>\n<pre><code class=\"python\">import time from typing import Any, Self  MAX_DEPTH = 6  # MAX_DEPTH \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e   class Bwt:    def _sort(self, rows: list[Any], depth: int = 0) -&gt; list[Any]:        # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f: \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0431\u043b\u043e\u0447\u043d\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430        if depth == MAX_DEPTH:  # \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438            rows.sort()  # \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438            return rows         buckets: dict[Any, Any] = {}        for row in rows:            key = row[depth]            if key not in buckets:                buckets[key] = []            buckets[key].append(row)        ans = []        for key in sorted(buckets.keys()):            # \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u0437 \u043a\u043e\u0440\u0437\u0438\u043d            buckets[key] = self._sort(buckets[key], depth + 1)            ans.extend(buckets[key])        return ans     def encode(self, data: bytes) -&gt; tuple[bytes, int]:        array = list(data)        array_size = len(array)         class ComparableRotation:            __slots__ = (\"shift\",)             # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a            def __init__(self, shift: int) -&gt; None:                self.shift = shift             def __getitem__(self, index: int) -&gt; int:                return array[(index + self.shift) % array_size]             def __lt__(self, other: Self) -&gt; bool:                # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f: \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435                si = self.shift                oi = other.shift                for _ in range(array_size):                    s = array[si]                    o = array[oi]                    if s &lt; o:                        return True                    elif s &gt; o:                        return False                    si += 1                    oi += 1                    if si == array_size:                        si = 0                    if oi == array_size:                        oi = 0                return False         table = [ComparableRotation(shift) for shift in range(array_size)]        table = self._sort(table)         encoded = []        origin = -1        for i, rot in enumerate(table):            if rot.shift == 0:                origin = i            encoded.append(rot[-1])        return (bytes(encoded), origin)     def decode(self, data: tuple[bytes, int]) -&gt; bytes:        encoded, origin = data        n = len(encoded)         # \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0432\u0443\u0434\u043e\u043b\u044c\u043d\u044b\u0439 \u0433\u0440\u0430\u0444 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432        transmissions_graph = list(range(n))        transmissions_graph.sort(key=lambda i: encoded[i])         current = origin        decoded = bytearray(n)        for i in range(n):            current = transmissions_graph[current]            decoded[i] = encoded[current]        return bytes(decoded)   if __name__ == \"__main__\":    bwt = Bwt()    input_bytes = None    block_size = -1  # 100 * 2**10  # 100 KiB    with open(\".\/Watts Peter. Blindsight.fb2\", \"rb\") as f:        input_bytes = f.read(block_size)    start = time.process_time()    encoded = bwt.encode(input_bytes)    decoded = bwt.decode(encoded)    print(f\"The input size is {len(input_bytes)} bytes.\")    print(f\"Encoding and decoding took {time.process_time() - start:.4f} seconds.\")    assert input_bytes == decoded <\/code><\/pre>\n<h2>\u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435<\/h2>\n<p><a class=\"anchor\" name=\"%D0%92%20%D1%81%D1%83%D1%85%D0%BE%D0%BC%20%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B5\" id=\"\u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435\"><\/a><\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2 (<code>RLE -&gt; BWT -&gt; MTF -&gt; RLE -&gt; HFC<\/code>), \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430 \u2014\u00a0 \u0432\u0435\u0449\u044c \u043e\u0447\u0435\u043d\u044c \u043d\u0438\u0448\u0435\u0432\u0430\u044f \u0438 \u043c\u0430\u043b\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0442\u043e \u0435\u0449\u0435 \u0438 \u0441\u0430\u043c\u044b\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432\u0441\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0432 \u043c\u043e\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043d\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438. \u0427\u0442\u043e \u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0432\u0435\u043d\u044c\u0435\u0432 \u0446\u0435\u043f\u0438\u2026<\/p>\n<p>RLE \u2014 \u043e\u0431\u043c\u0430\u043d\u0447\u0438\u0432\u043e \u043f\u0440\u043e\u0441\u0442, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e\u0433\u043e \u0447\u0435\u043b\u043b\u0435\u043d\u0434\u0436\u0430 (\u0438 \u0443 \u043c\u0435\u043d\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f <a href=\"https:\/\/habr.com\/ru\/companies\/kts\/articles\/831440\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043f\u043e \u043d\u0435\u043c\u0443).\u00a0<\/p>\n<p>MTF \u2014 \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0435\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f \u043c\u0438\u043d\u0443\u0442 \u0437\u0430 40 (\u0438 \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044f \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u0447\u0442\u0435\u043d\u0438\u0435 \u0412\u0438\u043a\u0438-\u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u043d\u0435\u043c).<\/p>\n<p>HFC \u2014 \u044f \u0431\u044b \u043f\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u043b \u0433\u0434\u0435-\u0442\u043e \u043c\u0435\u0436\u0434\u0443 RLE \u0438 BWT. \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u0438\u043c\u0435\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438 \u043f\u043e \u043d\u0435\u043c\u0443 \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0441 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u043c\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438.\u00a0<\/p>\n<p>\u0418\u0442\u043e\u0433\u043e: \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u043c\u0443 bzip2, \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c Move-To-Front, \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430, \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0449\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u042f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0438 \u043e\u0431 \u044d\u0442\u043e\u043c, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u043b\u0430\u043d\u044b \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u043e\u043f\u043b\u043e\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0436\u0438\u0437\u043d\u044c. \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u0441\u0438\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0442\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0442\u043e:<\/p>\n<ul>\n<li>\n<p>\u0432\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0432\u0430\u043c, \u0447\u0442\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b\u0438 \u0441\u043e \u043c\u043d\u043e\u0439 \u044d\u0442\u043e\u0442 \u043e\u043f\u044b\u0442;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432\u044b, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u0441\u044c \u0441\u043e \u0432\u0441\u0435\u0439 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0439\u0441\u044f \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u0438 \u0431\u0435\u0437 \u043c\u043e\u0435\u0439 \u043f\u043e\u043c\u043e\u0449\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0410 \u0442\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u0443\u0445\u043e\u0442\u044b, \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043b\u043e\u0433\u0430. \u0422\u0430\u043c \u043c\u043e\u0438 \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442 \u0447\u0443\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u043d\u0430\u0443\u043a\u043e\u0435\u043c\u043a\u0438\u0435, \u043d\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0435 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Python:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/kts\/articles\/912840\/\" rel=\"noopener noreferrer nofollow\">Pytest-xdist: \u043a\u0430\u043a \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u0431\u0435\u0437 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0432 \u0431\u0430\u0437\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/kts\/articles\/816757\/\" rel=\"noopener noreferrer nofollow\">\u0424\u043e\u043d\u043e\u0432\u044b\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 FastAPI \u0438 \u0438\u0445 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/937554\/\"> https:\/\/habr.com\/ru\/articles\/937554\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u042f \u0420\u043e\u043c\u0430, \u0431\u044d\u043a\u0435\u043d\u0434\u0435\u0440-\u043f\u0438\u0442\u043e\u043d\u0438\u0441\u0442 \u0432 <a href=\"https:\/\/kts.tech\/\" rel=\"noopener noreferrer nofollow\">KTS<\/a>.<\/p>\n<p>\u042d\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0432 \u043c\u043e\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u043e\u0431 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bzip2#Implementation\" rel=\"noopener noreferrer nofollow\">\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438 bzip2<\/a>. \u041f\u0435\u0440\u0432\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/habr.com\/ru\/companies\/kts\/articles\/831440\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>, \u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u0439 \u0442\u0435\u043c\u044b \u043e\u043d\u0430 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430. \u041d\u0438\u0436\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u044d\u0442\u0430\u043f \u0441\u0436\u0430\u0442\u0438\u044f bzip2.<\/p>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430: \u0432 \u0441\u0432\u043e\u0435\u043c \u0446\u0438\u043a\u043b\u0435 \u0441\u0442\u0430\u0442\u0435\u0439 \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438 bzip2 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 Python. \u0412\u0441\u044e \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044e \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043e\u043c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e \u0432 \u0441\u0432\u043e\u0435\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438. \u0412\u043a\u0440\u0430\u0442\u0446\u0435 \u2014 \u0446\u0438\u043a\u043b \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043b\u044c. \u041e\u043d \u0432\u044b\u0440\u043e\u0441 \u0438\u0437 <a href=\"https:\/\/github.com\/sentenzo\/bzip2\" rel=\"noopener noreferrer nofollow\">\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u043f\u0438\u0441\u0430\u043b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 bzip2-\u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043e\u0440 \u043d\u0430 Python (\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u043e \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c bzip2, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439).\u00a0<\/p>\n<p>\u0414\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u0432\u0435\u0441\u044c\u043c\u0430 \u0443\u0432\u0435\u0441\u0438\u0441\u0442\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u00ab\u043d\u0430\u0443\u0447\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u043d\u0438\u0442\u0430\u00bb. \u0412\u043f\u043e\u043b\u043d\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0438 \u043c\u043d\u0435, \u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0436\u0438\u0437\u043d\u0438 \u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u044f\u0442\u0441\u044f. \u0418 \u0432\u0441\u0435 \u0436\u0435 \u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0438\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u0438\u043b\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0433\u0440\u0430\u043d\u0438\u0442 \u043d\u0430 \u0444\u0440\u0430\u043a\u0446\u0438\u0438 \u0443\u0434\u043e\u0431\u043e\u0432\u0430\u0440\u0438\u043c\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430.<\/p>\n<p>\u041c\u043e\u044f \u0438\u0434\u0435\u044f \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u043e\u0441\u0438\u043b\u0438\u0432\u0448\u0438\u0439 \u0432\u0435\u0441\u044c \u0446\u0438\u043a\u043b, \u043c\u043e\u0433 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c bzip2-\u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043e\u0440 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d \u0432\u043b\u0430\u0434\u0435\u0435\u0442), \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0438\u0437 \u043c\u043e\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439.\u00a0<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u0432\u0430\u0436\u043d\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0432 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043a\u0440\u043e\u043c\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Python3. \u0421\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><strong>\u041e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/strong><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0%20bzip2\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0437\u043e\u0440 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20BWT%20%D0%B8%20%D0%BA%D0%B0%D0%BA%20%D0%BE%D0%BD%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82?\" rel=\"noopener noreferrer nofollow\">\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 BWT \u0438 \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#Encoding\" rel=\"noopener noreferrer nofollow\">Encoding<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%20%D1%87%D1%82%D0%BE%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Decoding\" rel=\"noopener noreferrer nofollow\">Decoding<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%20%D1%87%D1%82%D0%BE%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B52\" rel=\"noopener noreferrer nofollow\">\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%98%D0%BC%D0%BF%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BD%D0%B0%D0%B8%D0%B2%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430\u0438\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%20BWT%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 BWT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<ul>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8%20%D0%BF%D1%80%D0%B8%20%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%98%D0%B7%D0%B1%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%D1%81%D1%8F%20%D0%BE%D1%82%20%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B5%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%B8%20%D0%BF%D1%80%D0%B8%20%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D0%BA%D0%BE%D0%B4%20%D1%81%D0%BE%20%D0%B2%D1%81%D0%B5%D0%BC%D0%B8%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%D0%BC%D0%B8\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%92%20%D1%81%D1%83%D1%85%D0%BE%D0%BC%20%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0412 \u0441\u0443\u0445\u043e\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0435<\/a><\/p>\n<\/li>\n<\/ul>\n<h2>\u041e\u0431\u0437\u043e\u0440 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2<\/h2>\n<p><a class=\"anchor\" name=\"%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0%20bzip2\" id=\"\u041e\u0431\u0437\u043e\u0440 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2\">\u0442\u043c\u0430 bzip2&#8243;><\/a><\/p>\n<p>\u0421\u043b\u043e\u0432\u043e\u043c \u00abbzip2\u00bb \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0442\u0430\u043a \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0430\u044f \u0435\u0433\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Bzip2\" rel=\"noopener noreferrer nofollow\">\u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430<\/a>. \u0417\u0434\u0435\u0441\u044c \u0438 \u0434\u0430\u043b\u0435\u0435 (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043d\u043e\u0435) \u043f\u043e\u0434 \u0441\u043b\u043e\u0432\u043e\u043c \u00abbzip2\u00bb \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c.<\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432\u0432\u0435\u0434\u0435\u043c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438. <strong>\u0410\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u044f <\/strong>\u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438:<\/p>\n<ol>\n<li>\n<p><strong>\u0441\u0436\u0430\u0442\u0438\u0435<\/strong>: \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434\u0435;<\/p>\n<\/li>\n<li>\n<p><strong>\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0441\u0442\u044c<\/strong>: \u043c\u043e\u0436\u043d\u043e \u00ab\u0440\u0430\u0437\u0436\u0430\u0442\u044c\u00bb \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0436\u0430\u0442\u043e, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<\/ol>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c bzip2 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437 \u043d\u0438\u0445 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e, \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0441\u0436\u0438\u043c\u0430\u044e\u0442:<\/p>\n<p><code>RLE -&gt; BWT -&gt; MTF -&gt; RLE -&gt; HFC<\/code><\/p>\n<p>\u041f\u0440\u0438 \u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u0439\u043b \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0431\u043b\u043e\u043a\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b (\u0443\u0441\u043b\u043e\u0432\u043d\u043e, 100 KiB), \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0442\u0430\u043a\u043e\u0439 \u0431\u043b\u043e\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e. \u041f\u0440\u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0435 (\u0434\u0435\u0430\u0440\u0445\u0438\u0432\u0430\u0446\u0438\u0438) \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0434\u0442\u0438 \u043f\u043e \u0443\u0437\u043b\u0430\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435.<\/p>\n<p>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f RLE (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Run-length_encoding\" rel=\"noopener noreferrer nofollow\">Run-Length Encoding<\/a>) \u0438 HFC (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Huffman_coding\" rel=\"noopener noreferrer nofollow\">Huffman coding<\/a>) \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0441\u0436\u0430\u0442\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f BWT (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Burrows%E2%80%93Wheeler_transform\" rel=\"noopener noreferrer nofollow\">Burrows-Wheeler transform<\/a>) \u0438 MTF (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Move-to-front_transform\" rel=\"noopener noreferrer nofollow\">Move-to-front transform<\/a>) \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e: \u043d\u0435 \u0441\u0436\u0438\u043c\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u0440\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u0438\u0445 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0441 \u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/kts\/articles\/831440\/\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u0431\u044b\u043b\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 RLE, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0446\u0435\u043b\u044b\u0445 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. RLE <em>(aka Run-Length Encoding aka \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u0435\u0440\u0438\u0439) <\/em>\u2014 \u044d\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0440\u043e\u043a\u0443 <code>\"goooogle\"<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432 <code>\"g4ogle\"<\/code> (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432\u0441\u0451 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u043d\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a). RLE \u0432 bzip2 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u043b\u044c\u0432\u0438\u043d\u0443\u044e \u0434\u043e\u043b\u044e \u0441\u0436\u0430\u0442\u0438\u044f, \u043d\u043e \u043e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.\u00a0<\/p>\n<p>BWT \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a Burrows-Wheeler transform (\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430). \u041e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0437\u0432\u0435\u043d\u043e\u043c \u0446\u0435\u043f\u0438, \u0438, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u0430\u043c\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 bzip2.<\/p>\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u0430\u043b\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e BWT. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u0442\u0430\u043a\u043e\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u0435 \u0443 \u043c\u0435\u043d\u044f \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0434\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u0434 \u0441\u0432\u043e\u0438\u043c \u043f\u0435\u0442-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438, \u0430 \u0431\u0435\u0437 \u043d\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u0434\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e. \u041f\u043e \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0443\u043c\u043a\u0435, \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0442\u043e\u0440\u0430 \u0437\u0435\u043c\u043b\u0435\u043a\u043e\u043f\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0445\u043e\u0442\u044f\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043c\u043e\u0439 \u043f\u0443\u0442\u044c.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c\u0441\u044f \u0441 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0411\u0430\u0440\u0440\u043e\u0443\u0437\u0430-\u0423\u0438\u043b\u0435\u0440\u0430 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0438\u0432\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 \u0441\u043c\u044b\u0441\u043b \u0441\u0442\u043e\u0438\u0442 \u0437\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0440\u044f\u0434 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u044f\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043d\u0430\u0438\u0432\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u043e \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0435 \u0438 \u043c\u0435\u043d\u0435\u0435 \u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432\u043e\u0435.\u00a0<\/p>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 BWT \u0438 \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/h2>\n<p><a class=\"anchor\" name=\"%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20BWT%20%D0%B8%20%D0%BA%D0%B0%D0%BA%20%D0%BE%D0%BD%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82?\" id=\"\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 BWT \u0438 \u043a\u0430\u043a \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?\">\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?&#187;><\/a><\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\u0445. \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 BWT \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0431\u0430\u0439\u0442\u0430\u0445, \u043d\u043e \u0432 \u044d\u0442\u0443 \u0432\u0435\u0440\u0441\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043c\u044b \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u043e\u0442\u043c\u0435\u0442\u0438\u043b \u0432\u044b\u0448\u0435, BWT \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u00abencode\u00bb (\u043f\u0440\u044f\u043c\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f) \u0431\u0443\u0434\u0435\u0442 \u0435\u0449\u0435 \u043c\u0435\u0442\u043e\u0434 \u00abdecode\u00bb (\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, BWT \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439. \u0422\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435, \u043d\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0430\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b.<\/p>\n<p>\u0412\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b BWT \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0447\u0451\u0440\u043d\u043e\u0433\u043e \u044f\u0449\u0438\u043a\u0430:<\/p>\n<pre><code class=\"python\">bwt.encode(\"habrahabr\") -&gt; \"rhhraaa$bb\" bwt.decode(\"rhhraaa$bb\") -&gt; \"habrahabr\"  bwt.encode(\"abracadabra\") -&gt; \"ard$rcaaaabb\" bwt.decode(\"ard$rcaaaabb\") -&gt; \"abracadabra\"<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0433\u0440\u0443\u043f\u043f\u044b \u0438\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b <code>\"$\"<\/code>, \u043d\u043e \u043e \u043d\u0435\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435). \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e BWT \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e \u0441\u043a\u0440\u044b\u0442\u044b\u043c\u0438 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043e\u043d \u0447\u0430\u0441\u0442\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0435\u0440\u0438\u0438 (\u0430 \u0442\u0430\u043a\u0438\u0435 \u0441\u0435\u0440\u0438\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u0436\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 RLE).<\/p>\n<p>\u0412\u043e\u0442 \u0435\u0449\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043a\u0443\u0441\u043e\u043a \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0439 \u0445\u0443\u0434\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438:<\/p>\n<pre><code>eeeeeaoeeaioeaeeeaeeV7ZgfKHOOLXRArEs\/BHQ+rujieeeEnyeReeeeeoooeoeooeeaaao oooooooooaaiiiiieeinaaaaaaaaaaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeejeeeeeeeeeeeeeepfw\\nAf874n24BZKGCufni\/u\/bbbI?\/x5t97v9IIOoNB0pr\/f 0RfQQFaeedef4Gke\/CnWNeeeeeeeeaeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeEeeeEeeeeeeEEeeeeeeeeeeeeeeeeeeNseeeeeeeeeeeeeeeee eeeeeEeeeeeeeeeeeeeeeeeeeeEeeeeeeeeeeeeeEeeeeeeeeeeWpeeeeeeeeeeeFPf+yMPd 6P2rteOptbY9vYVfPtqQy4Yeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee eeeeeeeeeeeLE2eeiieEeeeeeeeeEeeeeeeeeeeeeeeeeeeeeeeeeiiiieeeeeeeeeEe8bee eeeEeeeeeeeeEEeeeeeeeeeeeeeeeeeeeiiiiiiiiiee9FFtSp26Lpaeeuees\/VKDB1Taaaa eQTDIQdbPooooooOoo9KoowazlAPB+Kea3rFMCaalrblzrbllltabtadmmrrtrltcttMlaar lhollralbeatheeedlrrlhlelleeleerllmdllelnnldmlemalBeeelhnamrleeelelleael dbllallellhhllrlklllblbmblhlltttrlnddlbnMMnmMMmMmmmMrlhlllhlhhhahhlrlhll ldplhugghlmlbbmbrbbllbtttbbahhhlllrrhdhaeerktkkhblrllllbblbaabblblllllll lbablllblllblbllbbarbrbblblrallaarzraalprrrrrprrlmnrgellllcalllrendeelll nlmllrllllrllrlltalrdlblalallMktlttlbblaeBlebnbaaatlaaeelleshlllbbllbllm rtdlmglrradrrxtrtlranrdaltrekltrrtrzrrarttrcrgrtkgaaghblrrrtrtbttgrrstll rllltbrarbmlrhlbflbkhbaolaatmmlkllndmteeeeeeeleleenehheeeeeeehebtmmlmmmr kmnnallllllalalMmelrrgvlrtdlllellllslltlbarkvlglalzrlalnmmmllllllllabggt allcrllllrllllngenaallllMalladlaallrmrllaadllaallaaammmamdllllndnnnnraee laaalaaalllllllllddllrlctakrddllolblaelaldrmmmmrrmmmelnalaalamdlmrrrnnbn lrmlbllltmmMnmmMmnrMtehoemmmmmmmMmtmrrMammverllllelmplheehclreeldttlrlrl larreeureeeedleeeeeedeteeeeehhleeeeeehhhllrlrmlrntmthnnBllrknmlmrnlllnba errellneettklneadeermmmdbelmmbrrrllllrrntdlnlglllnleemlnrlllbllelglrrelk eeeeeedeeeeeemeeeehleeeeeeeellrMnelrrdrrbllrmtkdnaeeeeterrrlnnssrttallmr<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0438 \u0434\u043b\u0438\u043d\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 \u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u0442\u0435\u043a\u0441\u0442\u0435. \u0421\u0436\u0430\u0442\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 RLE \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.\u00a0<\/p>\n<p>\u041f\u043e\u0440\u0430 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u044c \u0447\u0435\u0440\u043d\u043e\u0433\u043e \u044f\u0449\u0438\u043a\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e (\u0437\u0430\u0442\u043e \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u0443\u044e) \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<h3>Encoding<\/h3>\n<p><a class=\"anchor\" name=\"Encoding\" id=\"Encoding\"><\/a><\/p>\n<p>\u041d\u0430 \u0432\u0445\u043e\u0434 BWT \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u041f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0430 <code>\"habrahabr\"<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 BWT \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0439 \u043a\u0430\u043a \u0441 \u043a\u043e\u043b\u044c\u0446\u043e\u043c (\u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c \u0441 \u043e\u0434\u043d\u043e\u0438\u043c\u0435\u043d\u043d\u044b\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043c \u0438\u0437 \u043e\u0431\u0449\u0435\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b): \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u0435\u0440\u0432\u044b\u043c, \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u0433\u0434\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c, \u0430 \u0433\u0434\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u043b\u0430\u0441\u044c. BWT \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 <code>\"habrahabr\"<\/code> \u0438 <code>\"abrahabrh\"<\/code>.<\/p>\n<p>\u041d\u043e \u043c\u044b-\u0442\u043e \u0432\u0438\u0434\u0438\u043c \u044d\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u043c\u0435\u0441\u0442\u0435 \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u043c\u044b \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c <code>\"$\"<\/code>. \u041d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e \u00ab\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u00bb.<\/p>\n<pre><code class=\"python\">\"habrahabr\" =&gt; \"habrahabr$\"<\/code><\/pre>\n<p>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 \u0431\u044b\u043b \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u042d\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u044f\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043d\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u044d\u0442\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432\u0441\u0435\u0445 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432. \u041e\u043d\u0430 (\u0432 \u043f\u043e\u043b\u043d\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c) \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0432\u0441\u0435 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"python\">\"habrahabr$\" \"abrahabr$h\" \"brahabr$ha\" \"rahabr$hab\" \"ahabr$habr\" \"habr$habra\" \"abr$habrah\" \"br$habraha\" \"r$habrahab\" \"$habrahabr\"<\/code><\/pre>\n<p>\u041d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<pre><code class=\"python\">\"$habrahabr\" \"abr$habrah\" \"abrahabr$h\" \"ahabr$habr\" \"br$habraha\" \"brahabr$ha\" \"habr$habra\" \"habrahabr$\" \"r$habrahab\" \"rahabr$hab\"<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b (\u0442.\u0435. \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0431\u0443\u043a\u0432\u0443 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438). \u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:\u00a0<\/p>\n<pre><code class=\"python\">\"$habrahab\" + \"r\" \"abr$habra\" + \"h\" \"abrahabr$\" + \"h\" \"ahabr$hab\" + \"r\" \"br$habrah\" + \"a\" \"brahabr$h\" + \"a\" \"habr$habr\" + \"a\" \"habrahabr\" + \"$\" \"r$habraha\" + \"b\" \"rahabr$ha\" + \"b\"  \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2570\u2192 \"rhhraaa$bb\"<\/code><\/pre>\n<h4>\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/h4>\n<p><a class=\"anchor\" name=\"%D0%9D%D0%B0%20%D1%87%D1%82%D0%BE%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%B8%D1%82%D1%8C%20%D0%B2%D0%BD%D0%B8%D0%BC%D0%B0%D0%BD%D0%B8%D0%B5\" id=\"\u041d\u0430 \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\">\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435&#187;<\/a><\/p>\n<ol>\n<li>\n<p>\u0421\u0438\u043c\u0432\u043e\u043b \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u043c \u043f\u0430\u043b\u043a\u0438 \u0432 \u043a\u043e\u043b\u0435\u0441\u0430. \u041c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430, \u0430 \u043d\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c\u0441\u044f \u0442\u0435\u043a\u0441\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u044d\u0442\u043e\u0433\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430, \u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435: \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u043d\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e: \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043a\u0430\u043a-\u0442\u043e \u043c\u043e\u0433\u043b\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043c\u0435\u0442\u0438\u043b\u0438 \u0431\u044b \u0438\u0445 \u0447\u0438\u0441\u043b\u0430\u043c\u0438: <code>h\u2081 a\u2081 b\u2081 r\u2081 a\u2082 h\u2082 a\u2083 b\u2082 r\u2082<\/code>), \u043c\u044b \u0431\u044b <\/p>\n<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-470894","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/470894","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=470894"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/470894\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=470894"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=470894"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=470894"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}