Hum ek window [l,r] maintain karte hain = ab tak mila sabse rightmost segment jo prefix se match karta hai (shuru mein l=r=0).
Har i ke liye 1 se n−1 tak, do cases:
Case A — i>r (hum kisi bhi known box ke bahar hain).
Hamare paas koi information nahi. Scratch se compare karo:
Z[i]=max{k:s[k]=s[i+k]}k=0 se shuru karo. Agar Z[i]>0 hai, naya box set karo l=i,r=i+Z[i]−1.
Case B — i≤r (hum box ke andar hain).i′=i−l ko prefix mein mirror position maano. Hum Z[i′] jaante hain. Do sub-cases:
B1: Z[i′]<r−i+1. Mirror ka match poora box ke andar fit ho jaata hai. Kyunki box ke andar s bilkul prefix ke barabar hai, position i par match identical hai:
Z[i]=Z[i′](no comparisons, no box update)Comparison kyun nahi? Kyunki jo mismatch mirror ke match ko khatam karta hai woh box ke andar hi hai, toh guaranteed hai ki i par bhi wahi repeat hoga.
B2: Z[i′]≥r−i+1. Mirror ka match box boundary tak pahunch jaata hai; r se aage koi guarantee nahi, isliye k=r−i+1 se manually compare karna padega:
Z[i]=(r−i+1)+(extra matches found by comparing s[k] vs s[i+k])
Phir box update karo l=i,r=i+Z[i]−1.
Pattern p (length m) ko text t (length n) mein dhundhne ke liye: string banao
S=p+#+t(#∈/p,t)S (length m+1+n) par Z compute karo. Jahan bhi Z[i]=m ho, wahan pattern t mein position i−(m+1) par milta hai. Total cost O(n+m).
Socho kisi word ke pehle kuch letters tumhara "secret code" hain. Tum baaki word mein chalo aur har jagah poocho: "Yahan se shuru karke, kitne letters word ke shuru se match karte hain?" Slow tarika hai ki har baar zero se re-check karo. Clever trick yeh hai: agar tumne pehle ek lamba chunk match kiya tha, toh woh chunk shuruat ka ek photocopy hai — toh us chunk ke andar kisi jagah ka behavior bilkul wahi hoga jo shuruat ke matching jagah jaisa hai. Tum bas woh answer dekh lo jo pehle se likha hua hai, dobara count karne ki zarurat nahi. Naya counting sirf tab karo jab photocopied chunk ki edge ke bahar jao — aur kyunki woh edge sirf aage hi jaati hai, zyada kaam kabhi nahi hoga.
Index i se shuru hone wale substring ki length jo s ka prefix bhi hai, aur jo sabse lamba ho.
Naive Z computation O(n2) kyun hai?
"aaa...a" jaisi strings ke liye har starting index end tak re-scan karta hai, jo O(n2) comparisons tak add up hoti hain.
Z-box [l,r] kya hai?
Sabse rightmost (largest r) interval jo prefix se match karna already known hai: s[l..r]=s[0..r−l].
Case B (i≤r) mein mirror index kya hai?
i′=i−l; prefix ke andar corresponding position.
Box ke andar Z[i−l] copy kyun kar sakte hain bina compare kiye?
[l,r] ke andar string prefix ke equal hai, isliye s[i]=s[i−l]; mirror ka match (aur uska terminating mismatch) exactly repeat hota hai — agar woh box ke andar rahe. :::
min(r−i+1,Z[i−l]) kisse bachata hai?
r se aage aisi matches claim karne se jo kabhi verify nahi hui; yeh trust ko box boundary par cap karta hai.
Box kab update karte hain?
Sirf jab i+Z[i]−1>r ho, yaani naya match current box se aage right mein jaaye.
Total cost O(n) kyun hai?
Inner while ki har iteration r ko 1 se badhati hai; r sirf badhta hai aur ≤n−1 hai, isliye total extensions ≤n hain.
Z se pattern matching kaise karein?
S=pattern+#+text banao, Z compute karo; jahan Z[i]=m (pattern length) ho woh matches hain.