class Solution {
private:
    vector<int> Next(string str)
    {
        vector<int> n(str.length()) ;
        n[0] = -1 ; 
        int i = 0, pre = -1 ;
        int len = str.length() ;
        while (i < len)
        {
            while (pre >= 0 && str[i] != str[pre])
                pre = n[pre] ;
            ++i, ++pre ;
            if (i >= len)
                break ;
            if (str[i] == str[pre])
                n[i] = n[pre] ;
            else
                n[i] = pre ;
        }
        return n ;
    }
public:
    int strStr(string haystack, string needle) {
        if (0 == needle.length())
            return 0 ;
        
        vector<int> n(Next(needle)) ;
        
        int len = haystack.length() - needle.length() + 1 ;
        for (int i = 0; i < len; ++i)
        {
            int j = 0, k = i ;
            while (j < needle.length() && k < haystack.length())
            {
                if (haystack[k] != needle[j])
                {
                    if (n[j] >= 0)
                    {
                        j = n[j] ;
                        continue ;
                    }
                    else
                        break ;
                }
                ++k, ++j ;
            }
            if (j >= needle.length())
                return k-j ;
        }
        
        return -1 ;
    }
};