Contents

ARST打卡第350周

Algorithm

lc1895_最大的幻方

思路:

由于m,n最大都只有50,所以可以暴力枚举所有可能的幻方,然后找到最大的幻方。O(n^4)也不会超时。

前缀和加倒序优化。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Solution {
public:
    int largestMagicSquare(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        // 预处理前缀和
        vector<vector<int>> rowSum(m+1, vector<int>(n+1, 0));  // 行前缀和
        vector<vector<int>> colSum(m+1, vector<int>(n+1, 0));  // 列前缀和

        for(int i=0; i<m; ++i) {
            for(int j=0; j<n; ++j) {
                rowSum[i+1][j+1] = rowSum[i+1][j] + grid[i][j];
                colSum[i+1][j+1] = colSum[i][j+1] + grid[i][j];
            }
        }

        int maxLen = min(m, n);
        for(int len=maxLen; len>=2; --len) { // 从大到小,找到第一个返回
            for(int i=0; i<=m-len; ++i) {
                for(int j=0; j<=n-len; ++j) {
                    // 检查以(i,j)为左上角,边长len的幻方
                    int sum = rowSum[i+1][j+len] - rowSum[i+1][j];
                    bool ok = true;
                    // 检查所有行
                    for(int x=0; x<len; ++x) {
                        if(rowSum[i+x+1][j+len]-rowSum[i+x+1][j] != sum) {
                            ok = false; break;
                        }
                    }
                    if(!ok) continue;
                    // 检查所有列
                    for(int y=0; y<len; ++y) {
                        if(colSum[i+len][j+y+1] - colSum[i][j+y+1] != sum) {
                            ok = false; break;
                        }
                    }
                    if(!ok) continue;
                    // 检查主对角线
                    int s1=0, s2=0;
                    for(int d=0; d<len; ++d) {
                        s1 += grid[i+d][j+d];
                        s2 += grid[i+d][j+len-1-d];
                    }
                    if(s1==sum && s2==sum) return len;
                }
            }
        }
        return 1;  // 至少1x1一定是幻方
    }
};

Review

斯巴达勇士如何培养的【TED】

举国之力的精神和肉体的内卷专制循环筛选,只为了培养战斗战斗战斗…

这是一个系统,有点像军国主义专制的感觉。

Tip

私钥安全,跑在干净mac mini上,vps转发网络请求

很多大佬在思考私钥安全的时候,都是考虑私钥加密放在vps上,然后想着买大厂vps,然后给vps做各种防护。

自己用的一个小技巧则是把私钥放在干净的 mac mini 上,然后把网络请求通过vps转发出去。

  • mac mini的好处是安全,同性能配置下更便宜。缺点是如果断电断网,则可用性比vps差点。
  • vps则是可用性更好,但是安全性(信任成本)和性能成本更高。

Share-防x-ui爆破

x-ui是有名的x-ray一键安装面板,但是很容易发现x-ui的日志里面有很多的密码爆破的尝试。

自己也有一个节点被爆破成功了,把其中vmess改成了ss协议,导致一致无法访问。

所以有如下几种方式防止x-ui爆破:

  1. (简单防止,但是无法阻断爆破请求): 修改成复杂的用户名和密码
  2. (禁用端口,彻底阻断爆破请求): 设置完协议后,直接iptables封掉端口(iptables -D INPUT -p tcp --dport 433xx -j ACCEPT),等需要修改的时候再添加(iptables -I INPUT 9 -p tcp --dport 433xx -j ACCEPT
  3. (根路径hash,大幅减少被爆破的请求概率): 升级使用3x-ui面板,3x-ui默认有个随机的根路径,导致无法直接 ip:port 访问,需要通过根路径访问。