2019河南ICPC总结

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

猜你喜欢

转载自blog.csdn.net/qq_43700916/article/details/90448231