Homework Introduction

#include <bits/stdc++.h>
using namespace std;
const int N = 3e6 + 5;
int n, m, T, tot, tree[N][62], mp[N];

int Get(char x) {
	if (x >= 'A' && x <= 'Z')
		return x - 'A';
	else if (x >= 'a' && x <= 'z')
		return 26 + x - 'a';
	else
		return 52 + x - '0';
}

void insert(string s) {
	int u = 0;
	for (int i = 0; i < s.size(); i++) {
		int v = Get(s[i]);
		if (!tree[u][v])
			tree[u][v] = ++tot;
		u = tree[u][v];
		mp[u]++;
	}
}

int query(string s) {
	int u = 0;
	for (int i = 0; i < s.size(); i++) {
		int v = Get(s[i]);
		if (!tree[u][v])
			return 0;
		u = tree[u][v];
	}
	return mp[u];
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin >> T;
	while (T--) {
		for (int i = 0; i <= tot; i++) {
			for (int j = 0; j < 63; j++) {
				tree[i][j] = 0;
			}
			mp[i] = 0;
		}
		tot = 0;
		cin >> n >> m;
		for (int i = 1; i <= n; i++) {
			string t;
			cin >> t;
			insert(t);
		}
		for (int i = 1; i <= m; i++) {
			string t;
			cin >> t;
			cout << query(t) << endl;
		}
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, a[N], tree[N * 32][2], tot, ans;

void insert(int s) {
	int u = 0;
	for (int i = 30; i >= 0; i--) {
		int v = ((s >> i) & 1);
		if (tree[u][v] == 0)
			tree[u][v] = ++tot;
		u = tree[u][v];
	}
}

int query(int s) {
	int u = 0;
	int tmp = 0;
	for (int i = 30; i >= 0; i--) {
		int v = ((s >> i) & 1);
		if (tree[u][v ^ 1]) {
			u = tree[u][v ^ 1];
			tmp += (1 << i);
		} else
			u = tree[u][v];
	}
	return tmp;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= n; i++)
		insert(a[i]);
	for (int i = 1; i <= n; i++)
		ans = max(ans, query(a[i]));
	cout << ans << endl;
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int N = 105;
const ull base = 23333333;
int T, n, k, f[N][N], a[N];
ull h[N], p[N];

int Get(int l, int r) {
	return h[r] - h[l - 1] * p[r - l + 1];
}

int main() {
	cin >> T;
	while (T--) {
		cin >> n >> k;
		p[0] = 1;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
			h[i] = h[i - 1] * base + (ull)a[i];
			p[i] = p[i - 1] * base;
			f[i][i] = 1;
		}
		for (int len = 2; len <= n; len++) {
			for (int i = 1; i + len - 1 <= n; i++) {
				int j = i + len - 1;
				f[i][j] = 0x3f3f3f3f;
				for (int k = 1; k <= len; k++) {
					if (len % k == 0 && Get(i, j - k) == Get(i + k, j)) {
						f[i][j] = min(f[i][j], f[i][i + k - 1]);
					}
				}
				for (int k = i; k < j; k++) {
					f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
				}
			}
		}
		if (f[1][n] <= k)
			cout << "YES\n";
		else
			cout << "NO\n";
	}
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const ll N = 105;
const ll Mod = 23333333;
string s;
ll n, f[N][N], p[N], h[N];

ll Get(ll l, ll r) {
	return h[r] - h[l - 1] * p[r - l + 1];
}

int main() {
	for (int i = 1; i <= 100; i++) {
		for (int j = 1; j <= 100; j++) {
			f[i][j] = 1e18;
			if (j - i + 1 >= 1)
				f[i][j] = j - i + 1;
		}
	}
	cin >> s;
	n = s.size();
	s = " " + s;
	p[0] = 1;
	for (int i = 1; i <= n; i++) {
		p[i] = p[i - 1] * Mod;
		h[i] = h[i - 1] * Mod + s[i];
		f[i][i] = 1;
	}
	for (int len = 2; len <= n; len++) {
		for (int i = 1, j = len; j <= n; i++, j++) {
			for (int k = 1; k <= len; k++) {
				if (len % k == 0) {
					if (Get(i, j - k) == Get(i + k, j)) {
						int tmp = len / k;
						int cnt = 0;
						while (tmp)
							cnt++, tmp /= 10;
						f[i][j] = min(f[i][j], cnt + 2 + f[i][i + k - 1]);
					}
				}
			}
			for (int k = i; k < j; k++) {
				f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
			}
		}
	}
	cout << f[1][n] << endl;
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
int n, m, nxt[N];
string s, t;

int main() {
	cin >> s >> t;
	n = s.size(), m = t.size();
	nxt[0] = -1, nxt[1] = 0;
	int i = 2, j = 0;
	while (i <= m) {
		if (t[j] == t[i - 1])
			nxt[i] = j + 1, i++, j++;
		else if (nxt[j] != -1)
			j = nxt[j];
		else
			i++;
	}
	i = 0, j = 0;
	while (i < n) {
		if (s[i] == t[j])
			i++, j++;
		else if (nxt[j] != -1)
			j = nxt[j];
		else
			i++;
		if (j == m) {
			cout << i - m + 1 << endl;
			j = nxt[j];
		}
	}
	for (int i = 1; i <= m; i++) {
		cout << nxt[i] << " ";
	}
	return 0;
}

Problem

Please claim the assignment to see the problems.
Status
Live...
Problem
15
Open Since
2025-6-3 0:00
Deadline
2035-1-6 23:59
Extension
24 hour(s)