Example #1
0
        public static long[] PreComputeHashes(
            string T,
            int P,
            long p,
            long x)
        {
            string last = T.Substring(T.Length - P);

            long[] res = new long[T.Length - P + 1];
            res[T.Length - P] = Q2HashingWithChain.PolyHash(last, 0, last.Length);

            long pow = 1;

            for (int i = 0; i < P; i++)
            {
                pow = (pow * x) % p;
            }
            for (int i = T.Length - P - 1; i >= 0; i--)
            {
                long firstChr = res[i + 1] * x;
                long lastChr  = pow * (long)T[i + P];
                res[i] = (((T[i] + firstChr - lastChr) % p) + p) % p;
            }
            return(res);
        }
        public void PreComputeHashesTest()
        {
            // Uncomment the following line if you want to have it run
            // Assert.Inconclusive();
            string testStr    = "aaaa";
            int    patternLen = 2;

            long[] H = Q3RabinKarp.PreComputeHashes(
                testStr, patternLen, 101, 3);
            for (int i = 0; i < testStr.Length - patternLen + 1; i++)
            {
                long expectedHash =
                    Q2HashingWithChain.PolyHash(testStr, i, patternLen, 101, 3);
                Assert.AreEqual(expectedHash, H[i]);
            }
        }
Example #3
0
        public long[] Solve(string pattern, string text)
        {
            long        p     = 1000000007;
            long        x     = 263;
            List <long> res   = new List <long>();
            Random      t     = new Random();
            long        pHash = Q2HashingWithChain.PolyHash(pattern, 0, pattern.Length);

            long[] tHash = PreComputeHashes(text, pattern.Length, p, x);

            for (int i = 0; i < tHash.Length; i++)
            {
                if (tHash[i] == pHash)
                {
                    if (AreEqual(text, i, pattern))
                    {
                        res.Add(i);
                    }
                }
            }
            return(res.ToArray());
        }