<p>Given two strings <code>needle</code> and <code>haystack</code>, return the index of the first occurrence of <code>needle</code> in <code>haystack</code>, or <code>-1</code> if <code>needle</code> is not part of <code>haystack</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> haystack = &quot;sadbutsad&quot;, needle = &quot;sad&quot;
<strong>Output:</strong> 0
<strong>Explanation:</strong> &quot;sad&quot; occurs at index 0 and 6.
The first occurrence is at index 0, so we return 0.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> haystack = &quot;leetcode&quot;, needle = &quot;leeto&quot;
<strong>Output:</strong> -1
<strong>Explanation:</strong> &quot;leeto&quot; did not occur in &quot;leetcode&quot;, so we return -1.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= haystack.length, needle.length &lt;= 10<sup>4</sup></code></li>
	<li><code>haystack</code> and <code>needle</code> consist of only lowercase English characters.</li>
</ul>

class Solution {
public:
    int strStr(string haystack, string needle) {
        string s=needle+"$"+haystack;
        int n=s.length();
        int l=0;
        int r=0;
        vector<int>z(n,0);
        for(int i=1;i<n;i++)
        {
            if(i<r)
            {
                z[i]=z[i-l];
                if(i+z[i]>r)
                {
                    z[i]=r-i;
                }
            }
            while(i+z[i]<n && s[z[i]]==s[z[i]+i])
            {
                z[i]++;
            }
            if(i+z[i]>r)
            {
                l=i;
                r=z[i]+i-1;
            }
        }
        int m=needle.length();
        for(int i=m+1;i<n;i++)
        {
            if(z[i]==m)
            {
                return i-m-1;
            }
        }
        return -1;
    }
};

7900