public static long[] PreComputeHashes(
            string Text, int P, long p, long x)
        {
            int T = Text.Length;

            long[] result = new long[T - P + 1];
            string S      = Text.Substring(T - P, P);

            result[T - P] = Q2HashingWithChain.PolyHash(S, 0, S.Length, p, x);
            long y = 1;

            for (long i = 1; i <= P; i++)
            {
                y = (y * x) % p;
            }
            for (int i = T - P - 1; i >= 0; i--)
            {
                result[i] = (x * result[i + 1] + (p * 10) +
                             Convert.ToInt32(Text[i]) -
                             (y * Convert.ToInt32(Text[i + P]))) % p;
            }
            return(result);
        }
        public long[] Solve(string pattern, string text)
        {
            List <long> occurrences = new List <long>();
            int         P           = 1000000007;
            Random      random      = new Random();
            long        x           = random.Next(1, P - 1);
            long        pHash       = Q2HashingWithChain.PolyHash(pattern, 0,
                                                                  pattern.Length, P, x);

            long[] Hashes = PreComputeHashes(text, pattern.Length, P, x);

            for (int i = 0; i <= text.Length - pattern.Length; i++)
            {
                if (pHash != Hashes[i])
                {
                    continue;
                }
                if (text.Substring(i, pattern.Length) == pattern)
                {
                    occurrences.Add(i);
                }
            }
            return(occurrences.ToArray());
        }