<!DOCTYPE html>
	<html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
	<head>
<title>Xâu con | Câu 3 - Đề HSG tin 11 Nghệ An | Năm 2014 - 2015</title>
<meta name="description" content="Xâu con | Câu 3 - Đề HSG tin 11 Nghệ An | Năm 2014 - 2015 - Savefile - Tin tức -...">
<meta name="author" content="BÀI TẬP Ở NHÀ">
<meta name="copyright" content="BÀI TẬP Ở NHÀ [ducluu80@gmail.com]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index, archive, follow, noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="content-language" content="vi">
<meta property="og:title" content="Xâu con | Câu 3 - Đề HSG tin 11 Nghệ An | Năm 2014 - 2015">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin tức - https&#x3A;&#x002F;&#x002F;baitaponha.com&#x002F;savefile&#x002F;giai-de-tin-hoc&#x002F;xau-con-cau-3-de-hsg-tin-11-nghe-an-nam-2014-2015-49.html">
<meta property="og:site_name" content="BÀI TẬP Ở NHÀ">
<meta property="og:url" content="https://baitaponha.com/savefile/giai-de-tin-hoc/xau-con-cau-3-de-hsg-tin-11-nghe-an-nam-2014-2015-49.html">
<link rel="shortcut icon" href="https://baitaponha.com/uploads/logo.ico">
<link rel="canonical" href="https://baitaponha.com/savefile/giai-de-tin-hoc/xau-con-cau-3-de-hsg-tin-11-nghe-an-nam-2014-2015-49.html">
<link rel="alternate" href="https://baitaponha.com/rss/" title="Tin tức" type="application/rss+xml">
<link rel="alternate" href="https://baitaponha.com/rss/lap-trinh-python-co-ban/" title="Tin tức - Lập trình Python cơ bản." type="application/rss+xml">
<link rel="alternate" href="https://baitaponha.com/rss/giai-de-tin-hoc/" title="Tin tức - Giải đề tin học" type="application/rss+xml">
<link rel="alternate" href="https://baitaponha.com/rss/boi-gioi-tin-hoc/" title="Tin tức - Bồi giỏi tin học" type="application/rss+xml">
<link rel="alternate" href="https://baitaponha.com/rss/lap-trinh-c/" title="Tin tức - Lập trình C++" type="application/rss+xml">
<link rel="alternate" href="https://baitaponha.com/rss/thu-thuat-may-tinh/" title="Tin tức - Thủ thuật máy tính" type="application/rss+xml">
<link rel="preload" as="style" href="https://baitaponha.com/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://baitaponha.com/themes/egov/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://baitaponha.com/themes/egov/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://baitaponha.com/themes/egov/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://baitaponha.com/themes/egov/css/custom.css" type="text/css">
<link rel="preload" as="style" href="https://baitaponha.com/themes/egov/css/style-green.css" type="text/css">
<link rel="preload" as="style" href="https://baitaponha.com/themes/egov/css/news.css" type="text/css">
<link rel="preload" as="script" href="https://baitaponha.com/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/assets/js/jquery/jquery.cookie.js" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/themes/egov/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/themes/egov/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://www.googletagmanager.com/gtag/js?id=G-4JBZJ8SEPL" type="text/javascript">
<link rel="preload" as="script" href="https://baitaponha.com/themes/egov/js/bootstrap.min.js" type="text/javascript">
<link rel="StyleSheet" href="https://baitaponha.com/assets/css/font-awesome.min.css">
<link rel="StyleSheet" href="https://baitaponha.com/themes/egov/css/bootstrap.non-responsive.css">
<link rel="StyleSheet" href="https://baitaponha.com/themes/egov/css/style.css">
<link rel="StyleSheet" href="https://baitaponha.com/themes/egov/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://baitaponha.com/themes/egov/css/custom.css">
<link rel="StyleSheet" href="https://baitaponha.com/themes/egov/css/style-green.css">
<link rel="StyleSheet" href="https://baitaponha.com/themes/egov/css/news.css">
<style type="text/css">
	body{background: #fff;}
</style>

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3247389617576546"
     crossorigin="anonymous"></script>
     <!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-4JBZJ8SEPL"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-4JBZJ8SEPL');
</script>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-W4C9RPT');</script>
<!-- End Google Tag Manager -->
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-6V0WCB5SCB"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-6V0WCB5SCB');
</script>
<script async custom-element="amp-auto-ads"
        src="https://cdn.ampproject.org/v0/amp-auto-ads-0.1.js">
</script>		
<script async custom-element="amp-ad" src="https://cdn.ampproject.org/v0/amp-ad-0.1.js"></script>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-262364265-1"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-262364265-1');
</script>
<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-262364265-1', '.baitaponha.com');
ga('send', 'pageview');
</script>
</head>
	<body>
	    <amp-auto-ads type="adsense"
                    data-ad-client="ca-pub-3247389617576546">
        </amp-auto-ads>
<!-- BEGIN Fanpage Facebook -->
<div id="fb-root"></div>
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/vi_VN/sdk.js#xfbml=1&version=v16.0&appId=390459604647856&autoLogAppEvents=1" nonce="H8AT1lQt"></script>

<!-- END Fanpage Facebook -->
        <!-- Google Tag Manager (noscript) -->
            <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W4C9RPT"
            height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
        <!-- End Google Tag Manager (noscript) -->
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">BÀI TẬP Ở NHÀ</h2>
		<p class="pull-right"><a title="BÀI TẬP Ở NHÀ" href="https://baitaponha.com/">https://baitaponha.com</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Xâu con | Câu 3 - Đề HSG tin 11 Nghệ An | Năm 2014 - 2015</h1>
		<ul class="list-inline">
			<li>Thứ hai - 19/06/2023 21:32</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
			<span style="font-family:Times New Roman,Times,serif;"><span style="font-size:14pt"><span style="line-height:115%">Đây là một bài khá hay, một bài toán thách thức về thuật toán. Xử lý thuật toán tốt thì mới ăn full test bài này, còn không thì chỉ ăn được 60% test. Trong bài này chúng ta sẽ sử dụng thuật toán&nbsp;Rabin-Karp để tìm xâu con có độ dài bằng K xuất hiện trong xâu ban đầu, đây là thuật toán sử dụng mã băm. Thuật toán&nbsp;Rabin-Karp là thuật toán tương đối khó giải thích, các bạn có thể tự tìm hiểu thêm. Ngoài việc sử dụng thuật toán&nbsp;<span style="color:rgb(142, 68, 173);">Rabin-Karp</span>&nbsp;thì ta còn phài dùng thêm thuật toán <span style="color:rgb(142, 68, 173);">TÌM KIẾM NHỊ PHÂN</span>&nbsp;thì mới chạy full test bài này.<br />
<span style="color:red">Ngoài ra trong bài này các bạn sẽ thấy được yếu điểm của Python về tốc độ xử lý thuật toán. Cùng một thuật toán, nhưng Python xử lý chậm hơn Pascal rất nhiều lần! </span><span style="color:rgb(142, 68, 173);">Đừng quên&nbsp;theo dõi Fanpage và đăng ký kênh YOTUBE của admin để xem như lời cảm ởn!</span></span></span></span>
		</div>
				<div class="imghome">
			<img alt="THUẬT TOÁN RABIN-KARP VÀ TÌM KIẾM NHỊ PHÂN" src="https://baitaponha.com/uploads/news/2023_06/anh-chup-man-hinh-2023-06-20-113155.png" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">Bài 3. (6 điểm)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Xâu con&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></b></span></span></span><br />
<span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">Cho trước một xâu có độ dài L (1 <u>&lt;</u> L <u>&lt;</u> 2.10<sup>5</sup>) chỉ chứa các chữ cái thường trong bảng chữ cái tiếng Anh.</span></span></span></span></span></span><br />
<span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><i><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">Yêu cầu</span></span></span></i></b><b><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">: </span></span></span></b><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">Hãy tìm xâu con dài nhất xuất hiện ít nhất 2 lần trong xâu đã cho.</span></span></span></span></span></span><br />
<span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b><i>Dữ liệu vào </i></b>từ file XAU.INP:</span></span></span></span></span></span>
<ul>
	<li style="margin-left:8px; text-align:justify"><span style="font-size:14pt"><span style="line-height:115%"><span style="tab-stops:list 36.0pt"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">Dòng đầu là một số nguyên L.</span></span></span></span></span></span></span></li>
	<li style="margin-left:8px; text-align:justify"><span style="font-size:14pt"><span style="line-height:115%"><span style="tab-stops:list 36.0pt"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">Dòng sau là một xâu có độ dài L.</span></span></span></span></span></span></span></li>
</ul>
<span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><i><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">Kết quả</span></span></span></i></b><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif"> ghi ra file XAU.OUT: Chỉ một số duy nhất là độ dài của xâu con tìm được, nếu không tìm được thì ghi ra 0.</span></span></span></span></span></span><br />
<span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">&nbsp;Ví dụ:</span></span></span></span></span></span><br />
&nbsp;
<table align="right" class="Table" style="border-collapse:collapse; border:none; margin-left:9px; margin-right:9px">
	<tbody>
		<tr>
			<td style="border-bottom:1px solid black; width:101px; padding:0cm 7px 0cm 7px; border-top:1px solid black; border-right:1px solid black; border-left:1px solid black"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><span style="font-size:12.5pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">XAU.INP</span></span></span></b></span></span></span></td>
			<td style="border-bottom:1px solid black; width:93px; padding:0cm 7px 0cm 7px; border-top:1px solid black; border-right:1px solid black; border-left:none"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><span style="font-size:12.5pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">XAU.OUT</span></span></span></b></span></span></span></td>
			<td style="border-bottom:1px solid black; width:134px; padding:0cm 7px 0cm 7px; border-top:1px solid black; border-right:1px solid black; border-left:none"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><span style="font-size:12.5pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">XAU.INP</span></span></span></b></span></span></span></td>
			<td style="border-bottom:1px solid black; width:91px; padding:0cm 7px 0cm 7px; border-top:1px solid black; border-right:1px solid black; border-left:none"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><span style="font-size:12.5pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">XAU.OUT</span></span></span></b></span></span></span></td>
			<td style="border-bottom:1px solid black; width:83px; padding:0cm 7px 0cm 7px; border-top:1px solid black; border-right:1px solid black; border-left:none"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><span style="font-size:12.5pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">XAU.INP</span></span></span></b></span></span></span></td>
			<td style="border-bottom:1px solid black; width:91px; padding:0cm 7px 0cm 7px; border-top:1px solid black; border-right:1px solid black; border-left:none"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><b><span style="font-size:12.5pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">XAU.OUT</span></span></span></b></span></span></span></td>
		</tr>
		<tr>
			<td style="border-bottom:1px solid black; width:101px; padding:0cm 7px 0cm 7px; border-top:none; border-right:1px solid black; border-left:1px solid black"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">11</span></span></span></span></span></span><br />
			<span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">sabcabcfabc</span></span></span></span></span></span></td>
			<td style="border-bottom:1px solid black; width:93px; padding:0cm 7px 0cm 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">3</span></span></span></span></span></span></td>
			<td style="border-bottom:1px solid black; width:134px; padding:0cm 7px 0cm 7px; border-top:none; border-right:1px solid black; border-left:none"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">18 trutrutiktiktappop</span></span></span></span></span></span></td>
			<td style="border-bottom:1px solid black; width:91px; padding:0cm 7px 0cm 7px; border-top:none; border-right:1px solid black; border-left:none" valign="top"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">4</span></span></span></span></span></span></td>
			<td style="border-bottom:1px solid black; width:83px; padding:0cm 7px 0cm 7px; border-top:none; border-right:1px solid black; border-left:none"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">6 </span></span></span></span></span></span><br />
			<span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">abcdef</span></span></span></span></span></span></td>
			<td style="border-bottom:1px solid black; width:91px; padding:0cm 7px 0cm 7px; border-top:none; border-right:1px solid black; border-left:none"><span style="font-size:14pt"><span style="line-height:115%"><span style="font-family:&#039;.VnTime&#039;,sans-serif"><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif">0</span></span></span></span></span></span></td>
		</tr>
	</tbody>
</table>
<br />
<br />
<br />
<br />
<span style="font-size:12pt"><span style="line-height:115%"><span style="font-family:&#039;Times New Roman&#039;,serif"><span style="color:rgb(23, 54, 93);"><span style="letter-spacing:0.25pt"><span style="font-weight:bold"><i><span style="font-size:13.0pt"><span style="line-height:115%"><span style="font-weight:normal">Lưu ý: Có 60% số test của bài có độ dài xâu L <u>&lt;</u> 255</span></span></span></i></span></span></span></span></span></span><br />
<b><i><span style="font-size:13.0pt"><span style="font-family:&#039;.VnTime&#039;,sans-serif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></i></b><i><span style="font-size:13.0pt"><span style="font-family:&#039;.VnTime&#039;,sans-serif">Có 40% số test của bài có độ dài xâu L &gt;255</span></span></i>&nbsp;

<h2>Ý tưởng ban đầu.</h2>

<p>Sau khi đọc đề thì ý tưởng ban đầu sẽ là duyệt qua tất cả các xâu con (sub) của xâu L, sau đó dùng kỹ thuật đánh dấu để đếm xem sự xuất hiện của xâu con (sub) trong xâu L là bao nhiêu lần. Sau đó ta tìm các sub có giá trị &gt; 1 và kiểm tra xâu nào có độ dài lớn nhất thì in độ dài xâu đó. Đối với Python, để sử dụng kỹ thuật đánh dấu ta thường dùng kiểu dữ liệu từ điển (dictionary) để đánh dấu số lần xuất hiện của xâu con (sub). Sau đây là code mẫu bằng Python: (Chú ý: phương thức get() trong kiểu biến&nbsp;dictionary là lấy giá trị của phần tử.)</p>

<pre>
<code class="language-python"># Đọc dữ liệu từ file
with open(&quot;xau.inp&quot;, &quot;r&quot;) as f:
    L = int(f.readline().strip())  # Đọc độ dài xâu và chuyển sang kiểu int
    s = f.readline().strip()  # Đọc xâu và loại bỏ các ký tự xuống dòng

h = {}  # Khởi tạo một dictionary để lưu trữ giá trị Hash cho các xâu con
max_length = 0  # Khởi tạo giá trị độ dài của xâu con xuất hiện nhiều nhất là 0

# Duyệt qua tất cả các xâu con có thể có trong xâu s
for i in range(L):
    for j in range(i + 1, L + 1):
        sub = s&#91;i:j&#93;  # Lấy ra xâu con từ vị trí i đến j
        h&#91;sub&#93; = h.get(sub, 0) + 1  # Tăng giá trị của xâu con này trong từ điển lên 1(Đếm số lần xuất hiện)
# Tìm xâu con có độ dài lớn nhất xuất hiện ít nhất 2 lần
for sub, count in h.items():
    if count &gt; 1 and len(sub) &gt; max_length:
        max_length = len(sub)
        max_sub = sub

# Ghi kết quả ra file đầu ra XAU.OUT
with open(&#039;XAU.OUT&#039;, &#039;w&#039;) as f:
    f.write(max_length)</code></pre>

<p>Trong code mình đã giải thích rõ nên mình không giải thích gì thêm nhé. Tuy nhiên, code trên nhìn có vẻ êm, nhưng đọc kỹ đề ta thấy chiều dài xâu L tới 2.10<sup>5&nbsp;</sup>mà trong code trên ta thấy để duyết hết xâu con của L thì cần 2 vòng lặp For lồng nhau, nên độ phức tạp là O(n<sup>2</sup>) chắc chắn không full test. Vậy để chạy full test bài này ta cần kết hợp thuật toán Rabin-Karp và tìm kiếm nhị phân.</p>

<h2>Code mẫu bằng Pascal:</h2>

<pre>
<code>program XAU;

const
   MAXLEN  = 200000;
   MAXHASH = 200003;
   fi   = &#039;XAU.inp&#039;;
   fo   = &#039;XAU.out&#039;;
type node = record
   hash, key, next : longint;
end;

var
   nnodes         : longint;
   nodes          : array&#91;1..MAXLEN&#93; of node;
   tablica        : array&#91;0..MAXHASH-1&#93; of longint;
   L              : longint;
   str            : array&#91;1..MAXLEN&#93; of char;
   i, lo, hi, mid : longint;

col, ins:longint;

function trazi2(K : longint) : boolean;
var
   hash, sub, i, p, j : longint;
   isti               : boolean;
begin
   if K = 0 then begin
      trazi2 := true;
      exit;
   end;

   while nnodes &gt; 0 do begin
      tablica&#91; nodes&#91;nnodes&#93;.hash &#93; := -1;
      nnodes := nnodes-1;
   end;

   hash := 0; sub := 1;
   for i:=1 to K do begin
      sub := (26*sub) mod MAXHASH;
      hash := (26*hash + ord(str&#91;i&#93;)) mod MAXHASH;
   end;

   sub := MAXHASH - sub;

   for i:=K to L do begin
      p := tablica&#91;hash&#93;;
      while p &lt;&gt; -1 do begin
         isti := true;
         for j:=0 to K-1 do
            if str&#91; nodes&#91;p&#93;.key+j &#93; &lt;&gt; str&#91; i-K+1+j &#93; then begin
               isti := false;
               break;
            end;

         if isti then begin
            trazi2 := true;
            exit;
         end;

         p := nodes&#91;p&#93;.next;
      end;

      ins := ins+1;
      if tablica&#91;hash&#93; &lt;&gt; -1 then
         col := col+1;
      nnodes := nnodes+1;
      nodes&#91;nnodes&#93;.hash := hash;
      nodes&#91;nnodes&#93;.key  := i-K+1;
      nodes&#91;nnodes&#93;.next := tablica&#91;hash&#93;;
      tablica&#91;hash&#93; := nnodes;

      hash := (26*hash + sub*ord(str&#91;i-K+1&#93;) + ord(str&#91;i+1&#93;)) mod MAXHASH;
   end;

   trazi2 := false;
end;

begin
   assign(input,fi);
   reset(input);
   assign(output,fo);
   rewrite(output);
   readln(L);
   for i:=1 to L do  read(str&#91;i&#93;);

   for i:=0 to MAXHASH-1 do    tablica&#91;i&#93; := -1;

   lo := 0; hi := L-1;
   while lo&lt;hi do begin
      mid := (lo+hi+1) div 2;

      if trazi2(mid) then
         lo := mid
      else
         hi := mid-1;
   end;

   writeln(lo);
end.
</code></pre>

<h3>Giải thích: (Code dài nên mình sẽ giải thích kỹ hơn từng biến)</h3>

<p>Hàm&nbsp;<code>`trazi2`</code>&nbsp;sử dụng thuật toán Rabin-Karp để tìm kiếm chuỗi con có độ dài K xuất hiện trong chuỗi ban đầu được lưu trong mảng&nbsp;<code>`str`</code>.</p>

<p>Giải thích ý nghĩa của các biến toàn cục:</p>

<ul>
	<li><code>`nnodes`</code>: số lượng node trong danh sách liên kết, mỗi node chứa thông tin về mã băm, vị trí bắt đầu của chuỗi con tương ứng và phần tử tiếp theo trong danh sách.</li>
	<li><code>`nodes`</code>: mảng lưu trữ các node của danh sách liên kết.</li>
	<li><code>`tablica`</code>: bảng băm, lưu trữ các vị trí xuất hiện của các chuỗi con trong chuỗi ban đầu. Mỗi phần tử của mảng chứa một số nguyên tương ứng với node đầu tiên của danh sách liên kết chứa chuỗi con tương ứng, hoặc -1 nếu không có chuỗi con nào.</li>
	<li><code>`L`</code>: độ dài của chuỗi ban đầu.</li>
	<li><code>`str`</code>: mảng lưu trữ các ký tự của chuỗi ban đầu.</li>
	<li><code>`i`</code>: vị trí hiện tại đang xét trong chuỗi ban đầu.</li>
	<li><code>`lo`</code>,&nbsp;<code>`hi`</code>,&nbsp;<code>`mid`</code>: biến để tìm kiếm độ dài chuỗi con cần tìm.</li>
	<li><code>`col`</code>,&nbsp;<code>`ins`</code>: biến đếm số lần so sánh và chèn node vào danh sách.</li>
</ul>

<p>Hàm&nbsp;<code>`trazi2`</code>&nbsp;thực hiện các công việc sau:</p>

<ol>
	<li>Kiểm tra xem độ dài K có bằng 0 không, nếu có thì trả về True.</li>
	<li>Xóa toàn bộ node trong danh sách liên kết và đặt giá trị tất cả phần tử trong bảng băm về -1.</li>
	<li>Tạo mã băm cho chuỗi con đầu tiên có độ dài K.</li>
	<li>Duyệt qua chuỗi ban đầu từ vị trí K đến L.</li>
	<li>Tìm kiếm chuỗi con có độ dài K trong danh sách liên kết được lưu trữ trong bảng băm.</li>
	<li>Nếu tìm thấy chuỗi con, trả về True.</li>
	<li>Nếu không tìm thấy chuỗi con, tạo node mới cho chuỗi con này, thêm vào danh sách liên kết, và cập nhật bảng băm.</li>
	<li>Tạo mã băm cho chuỗi con tiếp theo bằng cách loại bỏ ký tự ở đầu tiên và thêm một ký tự mới ở cuối cùng.</li>
	<li>Sau khi duyệt xong, trả về False.</li>
</ol>

<p>Để chạy hàm&nbsp;<code>`trazi2`</code>&nbsp;và tìm độ dài của chuỗi con, chương trình sử dụng phương pháp tìm kiếm nhị phân. Lần đầu tiên lựa chọn giá trị mid bằng trung bình của giá trị lo và hi. Nếu tìm thấy chuỗi con có độ dài mid, lo sẽ được gán với mid. Nếu không tìm thấy chuỗi con, giá trị hi sẽ được gán bằng mid-1. Thực hiện đến khi lo bằng giá trị hi. Cuối cùng, độ dài của chuỗi con tìm được được ghi vào file đầu ra.</p>

<h2><strong>Chuyển code Pascal sang Python để so sánh tốc độ.</strong></h2>
Sau đây mình sẽ chuyển code Pascal trên thành code Python để so sánh tốc độ chạy, Để các bạn dễ so sánh về code Pascal và Python mình sẽ viết lại một cách tương đồng nhất có thể, mời các bạn tham khảo code Python:

<pre>
<code class="language-python">MAXLEN = 200000
MAXHASH = 200003
fi = &#039;XAU.inp&#039;
fo = &#039;XAU.out&#039;

class Node:
    def __init__(self, hash_val=0, key=0, next_node=-1):
        self.hash = hash_val
        self.key = key
        self.next = next_node

def trazi2(K):
    global tablica, nnodes, nodes, my_str, L, col, ins

    if K == 0:
        return True

    while nnodes &gt; 0:
        tablica&#91;nodes&#91;nnodes&#93;.hash&#93; = -1
        nnodes -= 1

    hash_val, sub = 0, 1
    for i in range(K):
        sub = (26 * sub) % MAXHASH
        hash_val = (26 * hash_val + ord(my_str&#91;i&#93;)) % MAXHASH

    sub = MAXHASH - sub

    ins = 0
    for i in range(K-1, L):
        p = tablica&#91;hash_val&#93;

        while p != -1:
            isti = True

            for j in range(K):
                if my_str&#91;nodes&#91;p&#93;.key + j&#93; != my_str&#91;i - K + 1 + j&#93;:
                    isti = False
                    break

            if isti:
                return True

            p = nodes&#91;p&#93;.next

        ins += 1

        if tablica&#91;hash_val&#93; != -1:
            col += 1

        nnodes += 1
        nodes&#91;nnodes&#93; = Node(hash_val, i - K + 1, tablica&#91;hash_val&#93;)
        tablica&#91;hash_val&#93; = nnodes

        if i &lt; L - 1:
            hash_val = (26 * hash_val + sub * ord(my_str&#91;i - K + 1&#93;) + ord(my_str&#91;i + 1&#93;)) % MAXHASH

    return False

with open(fi, &#039;r&#039;) as f_in, open(fo, &#039;w&#039;) as f_out:
    L = int(f_in.readline())
    my_str = f_in.readline().strip()

    tablica = &#91;-1&#93; * MAXHASH
    nodes = &#91;Node() for _ in range(MAXLEN)&#93;
    nnodes = 0

    lo, hi = 0, L - 1

    while lo &lt; hi:
        mid = (lo + hi + 1) // 2

        if trazi2(mid):
            lo = mid
        else:
            hi = mid - 1
    f_out.write(str(lo))
</code></pre>
Các bạn phải chạy cả hai chương trình bằng Pascal và Python sẽ thấy Python chậm hơn Pascal rất nhiều lần.<br />
&nbsp;
		</div>
				<div id="author">
						<p>
				<strong>Tác giả:</strong>
				<a href="https://baitaponha.com/author/admin/">admin</a>
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://baitaponha.com/savefile/giai-de-tin-hoc/xau-con-cau-3-de-hsg-tin-11-nghe-an-nam-2014-2015-49.html" title="Xâu con | Câu 3 - Đề HSG tin 11 Nghệ An | Năm 2014 - 2015">https://baitaponha.com/savefile/giai-de-tin-hoc/xau-con-cau-3-de-hsg-tin-11-nghe-an-nam-2014-2015-49.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; BÀI TẬP Ở NHÀ
		</div>
		<div id="contact">
			<a href="mailto:ducluu80@gmail.com">ducluu80@gmail.com</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://baitaponha.com/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
<div id="run_cronjobs" style="visibility:hidden;display:none;"><img alt="cron" src="/index.php?second=cronjobs&amp;p=o8HXue2r" width="1" height="1" /></div>
<script src="https://baitaponha.com/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="btol",nv_check_pass_mstime=21538000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://baitaponha.com/assets/js/language/vi.js"></script>
<script src="https://baitaponha.com/assets/js/DOMPurify/purify3.js"></script>
<script src="https://baitaponha.com/assets/js/global.js"></script>
<script src="https://baitaponha.com/assets/js/site.js"></script>
<script src="https://baitaponha.com/themes/default/js/news.js"></script>
<script src="https://baitaponha.com/assets/js/jquery/jquery.cookie.js"></script>
<script src="https://baitaponha.com/themes/egov/js/main.js"></script>
<script src="https://baitaponha.com/themes/egov/js/custom.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-4JBZJ8SEPL"></script>
<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}gtag('js',new Date);gtag('config','G-4JBZJ8SEPL');</script>
<script src="https://baitaponha.com/themes/egov/js/bootstrap.min.js"></script>
</body>
</html>