LeetCode Contest 247

每周例行崩溃,倒数第三题卡超时,导致最后一题没时间做了

T1: Maximum Product Differenct Between Two Pairs

取最大2个和最小2个,然后两者相乘再相减即可

T2: Cyclically Rotating a Grid

暴力模拟转动即可

T3: Number of Wornderful Substrings

状态压缩的数学统计,记录i-j的状态为(1-j)^(1-i-1)的状态,1-j的状态提前记录下来,时间复杂度为10n

public long wonderfulSubstrings(String word) {
    long[] fn = new long[1024];
    fn[0] = 1;
    int now = 0;
    long ans = 0;
    for(int i=0;i<word.length();i++) {
        int p = 1 << (word.charAt(i) - 'a');
        now = now ^ p;
        ans += fn[now];
        for(int k=0;k<10;k++) {
            ans += fn[now ^ (1 << k)];
        }
        fn[now] += 1;
    }
    return ans;
}

T4: Count Ways to Build Rooms in an Ant Colony

数学统计,假设两颗子树分别统计方案数和子树结点为Way1,Cnt1, Way2, Cnt2,那么这两个子树的方案是C[Cn1][Cnt1+Cnt2] * Way1 * Way2取模, 然后C可以通过费马小定理进行计算求出,费马小定理:a ^ (p-1) % p = 1 => a^(p-2) % p = 1/a