अजगर 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 0 बाहर निकलने की स्थिति के साथ 218)
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]हो जाते हैं, तो हम मैच के लिए अगले संभावित स्थान पर सबसे लंबे समय तक प्रत्यय के अनुसार वापस आ सकते 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