GESP『202503』C++ 七级编程题题解

坏消息是:我七级考的一坨,可能连及格都不行QAQ.

第一道:

总结来说,链式前向星(其他也可以) + 三维数组 + 暴!!!

题目大意:

给定一个 \(n\) 个节点, \(m\) 条边的无向图.按照
节点编号 \(\left (1,2,...,n\right )\) 的顺序输出,每行 \(k\) 个整数.
对于第 \(i\) 行的第 \(j\) 个整数,表示从i号节点出发恰好移动j步能到达的节点数量.

总测试范围:保证 \(1 \le n \le 500\), \(1 \le m \le 500\), \(1 \le k \le 20\), \(1 \le u_i\,v_i \le n\).

对于n和m这么不堪一击的范围,相信懂暴力的已经知道了。
可以直接模拟从每一个节点出发能到的所有节点并且统计走过的步数和节点。

不过至于题目中莫名其妙的链式前向星...只要图能遍历就没有问题!

\(\mathfrak{The Code:}\)

#include<bits/stdc++.h>
using namespace std;
int n,m,k,f[24][505][505];
vector<int> G[505]; //邻接表
int main(){
    cin >> n >> m >> k;
    for(int i = 1;i <= m;i++){
        int u,v;
        cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for (int i = 1; i <= n; i++)
        f[0][i][i] = 1; // 0步时没有出发,所以只有自己一个节点
    for (int t = 1; t <= k; t++)
        for (int x = 1; x <= n; x++)
            for (int y = 1; y <= n; y++)
                if (f[t - 1][x][y])
                    for (int i = 0; i < G[y].size(); i++)
                        f[t][x][G[y][i]] = 1;  //下一步能走的节点就是周边的节点
    for (int i = 1; i <= n; i++) {
        for (int t = 1; t <= k; t++) {
            int ans = 0;
            for (int j = 1; j <= n; j++)
                ans += f[t][i][j];  //统计答案
                cout<<ans<<" ";
        }
        cout<<'\n';
    }
    return 0;
}

真是酣畅淋漓的一场的暴力战啊...

第二题:

总结:哈希 + 二进制位掩码 + 组合数学

题目大意:

如果一个字符串,可以将串内相同的字符成对的消除,
最后将字符串变为空串,我们称为是"可等价消除的".

给定长度为n的字符串S,求有多少个S的子串是可等价消除的.

总数据范围:\(1 \le |S| \le 2 \cdot 10^5\),且保证字符串内只出现小写字母.

如果刷过GESP24年六月真题的话,会发现与之前一道题十分相似.

题目网址:GESP『202406』区间乘积

这道题可以用前缀和统计。前i位每个字母的奇偶性用二进制串表示。
如果要统计子集,可以加与前面字母哈希一样的个数.

\(\mathfrak{The Code:}\)

#include <bits/stdc++.h>
using namespace std;
long long n,ans;
string s;
map <int, int> m;
int main() {
    cin >> n >> s;
    int v = 0;
    m[v]++;
    for (int i = 0; i < n; i++) {
        v ^= 1 << (s[i] - 'a');
        ans += m[v];
        m[v]++;
    }
    cout<<ans;
    return 0;
}
posted @ 2025-03-26 21:34  Cai_hy  阅读(126)  评论(0)    收藏  举报