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;
}