পাইথন 2, 338 326 323 321 310 306 297 293 290 289 280 279 266 264 259 237 230 229 226 223 222 220 219 217 ( 260 238 231 228 225 223 221 220 218 0 প্রস্থান স্থিতি সহ)
exec'''s=raw_input()
S=[M-s.rfind(c,0,M)for M,c in enumerate(s)]
k=0
j=x=%s
while k<=M+x:
if S[k]>j<W[j]or S[k]==W[j]:
k+=1;j+=1;T+=[j]
if j-L>x:print s[k-j:k];z
else:j=T[j]
'''*2%('-1;T=[0];W=S;L=M',0)
print'No!'
অ্যালগরিদম হ'ল কেএমপির একটি প্রকরণ, চরিত্রের মিলের জন্য সূচক ভিত্তিক পরীক্ষা ব্যবহার করে। মূল ধারণাটি হ'ল আমরা যদি পজিশনে কোনও অমিল পেয়ে থাকি X[i]তবে আমরা ম্যাচের জন্য পরবর্তী সম্ভাব্য জায়গায় ফিরে যেতে পারি of এর দীর্ঘতম প্রত্যয়টি X[:i]একটি উপসর্গের আইসোমরফিক X।
বাম থেকে ডানে কাজ করে আমরা প্রতিটি অক্ষরকে সেই চরিত্রের সাম্প্রতিকতম পূর্ববর্তী উপস্থিতির দূরত্বের সমান সূচক নির্ধারণ করি, বা যদি পূর্বের কোনও উপস্থিতি না থাকে তবে আমরা বর্তমান স্ট্রিং উপসর্গটির দৈর্ঘ্য গ্রহণ করি। উদাহরণ স্বরূপ:
MISSISSIPPI
12313213913
দুটি অক্ষর মেলে কিনা তা পরীক্ষা করতে আমরা সূচকগুলি তুলনা করি, বর্তমান (উপ) স্ট্রিংয়ের দৈর্ঘ্যের চেয়ে বড় সূচকগুলির জন্য যথাযথভাবে সামঞ্জস্য করি।
কেএমপি অ্যালগরিদম একটু সরল হয়ে যায় কারণ আমরা প্রথম চরিত্রটিতে কোনও অমিল পেতে পারি না।
এই প্রোগ্রামটি যদি বিদ্যমান থাকে তবে প্রথম ম্যাচটি আউটপুট করে। আমি কোনও ম্যাচের ইভেন্টে প্রস্থান করার জন্য একটি রানটাইম ত্রুটি ব্যবহার করি তবে কিছু বাইটের দামে পরিষ্কারভাবে প্রস্থান করতে কোডটি সহজেই সংশোধন করা যায়।
দ্রষ্টব্য: কম্পিউটিং সূচকগুলির জন্য, আমরা ব্যবহার করতে পারি str.rfind(অভিধানটি ব্যবহার করে আমার আগের পদ্ধতির বিপরীতে) এবং এখনও রৈখিক জটিলতা ধরে রেখে ধরে নিচ্ছি যে str.rfindশেষ থেকে অনুসন্ধান শুরু হবে (যা একমাত্র বুদ্ধিমান প্রয়োগের পছন্দ বলে মনে হচ্ছে) - বর্ণমালার প্রতিটি অক্ষরের জন্য , আমাদের কখনই স্ট্রিংয়ের একই অংশটি দু'বার অতিক্রম করতে হয় না, সুতরাং (বর্ণমালার আকার) * (স্ট্রিংয়ের আকার) তুলনার একটি উপরের বাউন্ড থাকে।
যেহেতু কোডটি গল্ফিংয়ের সময়টি মোটামুটিভাবে অচল হয়ে পড়েছিল, তাই এখানে পড়ার আগে (293 বাইট) সমাধানটি কিছুটা সহজ:
e=lambda a:a>i<W[i]or a==W[i]
exec('s=raw_input();S=[];p={};M=i=0\nfor c in s:S+=[M-p.get(c,-1)];p[c]=M;M+=1\nW=S;L=M;'*2)[:-9]
T=[0]*L
k=1
while~k+L:
if e(W[k]):i+=1;k+=1;T[k]=i
else:i=T[i]
m=i=0
while m+i<M:
if e(S[m+i]):
if~-L==i:print s[m:m+L];z
i+=1
else:m+=i-T[i];i=T[i]
print'No!'
eফাংশন পরীক্ষা অক্ষরের সমানতা। execবিবৃতি সূচকের নির্ধারণ এবং কিছু পরিবর্তনশীল initialisations আছে। Xপিছনে ফিরে আসা মানগুলির জন্য প্রথম লুপ প্রক্রিয়া , এবং দ্বিতীয় লুপটি স্ট্রিং অনুসন্ধান করে।
আপডেট: এখানে এমন একটি সংস্করণ যা পরিষ্কারভাবে প্রস্থান করে, এক বাইটের দামে:
r='No!'
exec'''s=raw_input()
S=[M-s.rfind(c,0,M)for M,c in enumerate(s)]
k=0
j=x=%s
while k<=M+x:
if S[k]>j<W[j]or S[k]==W[j]:
k+=1;j+=1;T+=[j]
if j-L>x:r=k=s[k-j:k]
else:j=T[j]
'''*2%('-1;T=[0];W=S;L=M',0)
print r