2019河南ICPC总结

    xiaoxiao2022-07-05  174

    A题

    分析:

    直通过STl暴力就可以了(题的本来目的是考察KMP,但数据水到不行)

    代码:

    #include<bits/stdc++.h> using namespace std; int main() { int t; cin >> t; while (t--) { int ans = 0; string m, n, s; cin >> m >> s; n = m; reverse(n.begin(), n.end()); int mlen = m.length(), slen = s.length(); for (int i = 0; i <= slen - mlen; i++) { if (s.substr(i, mlen) == m)ans++; if (s.substr(i, mlen) == n)ans++; } if (n == m)ans /= 2; cout << ans << endl; } return 0; }

     

    C题

    分析:

    本题不算难,但坑点很多:多组数据,一段序列只可以包含一个密码子。有一处想不到就要wa一发。

    代码:

    #include<bits/stdc++.h> using namespace std; struct In { int st; int len; }in[510]; int main() { int n, k; while (cin >> n >> k) { int alen[110], tlen, cnt = 0; string a[110], t, s; for (int i = 0; i<n; i++){ cin >> a[i]; alen[i] = a[i].length(); } cin >> t; tlen = t.length(); for (int i = 0; i<tlen; i++){ for (int j = 0; j<n; j++){ if (i + alen[j] <= tlen&&t.substr(i, alen[j]) == a[j]){ in[cnt++] = { i, alen[j] }; i += alen[j] - 1; break; } } } for (int i = 0; i<k; i++){ int ans = 0; cin >> s; for (int j = 0; j<cnt; j++) if (t.substr(in[j].st, in[j].len) != s.substr(in[j].st, in[j].len)) ans++; cout << ans << endl; } } return 0; }

    E题

    分析:

    先建树求每一节点的子节点总数,再遍历所有节点求和路径。用于子节点全是小于节点序号的,所以建树时会比较方便,直接一个循环就搞定了。其中坑点是,子节点数是int范围内的数,但数据可能满足两个int相乘造成爆int,所以要用ll来存。

    代码:

    #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 2e5 + 10; struct City { vector<int>v; ll sum; }city[maxn]; int main() { int t; cin >> t; while (t--) { ll ans = 0; int n; cin >> n; for (int i = 1; i <= n; i++){ city[i].sum = 1; city[i].v.clear(); }//init for (int i = 0; i<n - 1; i++) { int a, b; scanf("%d%d", &a, &b); if (a<b)swap(a, b); city[a].v.push_back(b); } for (int i = 1; i <= n; i++) { int len = city[i].v.size(); for (int j = 0; j<len; j++) { city[i].sum += city[city[i].v[j]].sum; } for (int j = 0; j<len; j++) { ans += city[city[i].v[j]].sum*(city[i].sum - city[city[i].v[j]].sum - 1); } } cout << ans << endl; } return 0; }

    J题

    分析:

    简单的找规律题。

    代码:

    #include<bits/stdc++.h> using namespace std; int lowbit(int a) { return a&(-a); } int main() { int t; cin >> t; while (t--) { int n, a, mi, ma; cin >> n; mi = n; while ((a = lowbit(mi)) != 1)mi -= a / 2; ma = n * 2 - mi; cout << mi << ' ' << ma << endl; } return 0; }

     

    最新回复(0)