2019河南ICPCサマリー

質問A

分析:

ST1の暴力行為を行うだけです(質問の本来の目的は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

分析:

この質問は難しくありませんが、多くの落とし穴があります。複数のデータセット、シーケンスには1つのコドンしか含めることができません。あなたがわを送らなければならない予期しない場所があります。

コード:

#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の範囲の数ですが、データは2つの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