Syntax Colorizer

permlink
public class KSubstring
{
    bool Compatible(SumIndices indices1, SumIndices indices2, int len)
    {
        return Compatible(indices1.Left, indices2.Right, len) || Compatible(indices2.Left, indices1.Right, len);
    }

    private bool Compatible(int left, int right, int len)
    {
        return left + len <= right;
    }

    class SumIndices
    {
        public int Left;
        public int Right;
        public long Sum;

        public SumIndices(int left, int right, long sum)
        {
            Left = left;
            Right = right;
            Sum = sum;
        }
    }

    class SumEntry : IComparable<SumEntry>
    {
        public long Sum;
        public int Idx;

        public SumEntry(long sum, int idx)
        {
            Sum = sum;
            Idx = idx;
        }

        public int CompareTo(SumEntry other)
        {
            if (Sum != other.Sum)
                return Sum.CompareTo(other.Sum);
            return Idx.CompareTo(other.Idx);
        }
    }

    public int[] maxSubstring(int A0, int X, int Y, int M, int n)
    {
        long[] A = new long[n];
        A[0] = A0;
        for (int i = 1; i < n; i++)
            A[i] = (A[i - 1] * X + Y) % M;

        long resDiff = int.MaxValue;
        int resLen = -1;
        for (int len = n / 2; len >= 1; len--)
        {
            long[] sums = new long[n - len + 1];
            for (int i = 0; i < len; i++)
                sums[0] += A[i];
            for (int i = 1; i < sums.Length; i++)
                sums[i] = sums[i - 1] + A[i + len - 1] - A[i - 1];
            
            SumEntry[] sumEntries = new SumEntry[sums.Length];
            for (int i = 0; i < sums.Length; i++)
                sumEntries[i] = new SumEntry(sums[i], i);
            Array.Sort(sumEntries);

            List<SumIndices> sumIndices = new List<SumIndices>();
            int left = 0;
            while (left < sumEntries.Length)
            {
                int right = left;
                while (right + 1 < sumEntries.Length && sumEntries[right + 1].Sum == sumEntries[left].Sum)
                    right++;
                sumIndices.Add(new SumIndices(sumEntries[left].Idx, sumEntries[right].Idx, sumEntries[left].Sum));
                left = right + 1;
            }

            SumIndices prev = null;
            foreach (SumIndices cur in sumIndices)
            {
                if (Compatible(cur.Left, cur.Right, len))
                    return new int[] { len, 0 };
                if (prev != null && Compatible(prev, cur, len))
                {
                    long ndiff = Math.Abs(prev.Sum - cur.Sum);
                    if (ndiff < resDiff)
                    {
                        resDiff = ndiff;
                        resLen = len;
                    }
                }
                prev = cur;
            }
        }
        return new int[] { resLen, (int) resDiff };
    }
}

For you blog

For web page

About | Send us feedback