Submission #37028224


Source Code Expand

//O(NQ) ....
#include <iostream>
#include <string>
#include <algorithm>
#include <functional>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cmath>
#include <tuple>
#include <random>
#include <cassert>
#include <unordered_map>
#define rep(i, n) for(i = 0; i < n; i++)
#define int long long
using namespace std;

mt19937 mt(2521);

int naive(string s) {
	queue<string> que;
	unordered_map<string, int> dp;
	map<string, string> prevS;
	vector<vector<int>> perms = {{0, 1, 2}, {0, 2, 1}, {1, 0, 2}, {1, 2, 0}, {2, 0, 1}, {2, 1, 0}};

	que.push(s);
	dp[s] = 0;
	int ret = -1;
	string ret_s;
	while (!que.empty()) {
		string now = que.front(); que.pop();
		int n = now.length();

		bool check = true;
		for (int i = 0; i < n - 1; i++) {
			if (now[i] != now[i + 1]) { check = false; break; }
		}
		if (check) { ret = dp[now]; ret_s = now; break; }

		for (int i = 0; i < 6; i++) {
			for (int l = 0; l < n; l++) {
				string t;
				for (int r = l; r < n; r++) {
					int x = perms[i][now[r] - 'A'];
					t += (char)(x + 'A');
					string nxt;
					for (int k = 0; k < l; k++) nxt += now[k];
					nxt += t;
					for (int k = r + 1; k < n; k++) nxt += now[k];
					if (dp.find(nxt) == dp.end()) {
						dp[nxt] = dp[now] + 1;
						prevS[nxt] = now;
						que.push(nxt);
					}
				}
			}
		}
	}

	/*for (int i = 0; i < ret; i++) {
		cout << ret_s << endl;
		ret_s = prevS[ret_s];
	}
	cout << ret_s << endl;*/
	return ret;
}

int greedy(string s) {
	int i;
	string ss;
	rep(i, s.length()) {
		if (i > 0 && s[i - 1] == s[i]) continue;
		ss += s[i];
	}
	//cout << "ss = " << ss << endl;

	int ret = ss.length();
	int n = ss.length();
	typedef pair<int, char> P;
	for (char c = 'A'; c <= 'C'; c++) {
		vector<P> vec;
		int len = 0; char first_char = '-';
		
		//cout << "c = " << c << endl;
		rep(i, n) {
			if (ss[i] == c) {
				if (len > 0) vec.push_back(P(len, first_char));
				len = 0;
				continue;
			}
			if (len == 0) first_char = ss[i];
			len++;
		}
		if (len > 0) vec.push_back(P(len, first_char));

		int cst = 0;
		
		rep(i, vec.size()) {
			cst += vec[i].first / 2 + 1;
		}

		int cnt = 0;
		for (int i = 0; i < vec.size(); i++) {
			if (vec[i].first % 2 == 0) cnt++;
		}
		cst -= cnt / 2;
		//cout << "cst = " << cst << endl;
		ret = min(ret, cst);
	}
	return ret;
}

void solve_input() {
	int n, Q;
	cin >> n >> Q;
	string s;
	cin >> s;
	for (int i = 0; i < Q; i++) {
		int l, r;
		cin >> l >> r; l--; r--;

		string t;
		for (int j = l; j <= r; j++) t += s[j];
		cout << greedy(t) << endl;
	}
}

signed main() {
	solve_input();
	return 0;

	//naive("ABCCACABC");
	//return 0;

	/*int n = 10, i;
	int T = 2000;

	for (int t = 0; t < T; t++) {
		cout << "t = " << t << endl;
		string s;
		rep(i, n) {
			s += (char)(mt() % 3 + 'A');
		}
		int res1 = naive(s);
		int res2 = greedy(s);
		if (res1 != res2) {
			cout << s << " " << res1 << " " << res2 << endl;
			break;
		}
	}

	return 0;*/
}

Submission Info

Submission Time
Task A - My Last ABC Problem
User startcpp
Language C++ (GCC 9.2.1)
Score 0
Code Size 3114 Byte
Status TLE
Exec Time 2205 ms
Memory 4588 KiB

Compile Error

./Main.cpp: In function ‘long long int greedy(std::string)’:
./Main.cpp:17:32: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::__cxx11::basic_string<char>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   17 | #define rep(i, n) for(i = 0; i < n; i++)
......
   74 |  rep(i, s.length()) {
      |      ~~~~~~~~~~~~~              
./Main.cpp:74:2: note: in expansion of macro ‘rep’
   74 |  rep(i, s.length()) {
      |  ^~~
./Main.cpp:17:32: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<std::pair<long long int, char> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
   17 | #define rep(i, n) for(i = 0; i < n; i++)
......
  101 |   rep(i, vec.size()) {
      |       ~~~~~~~~~~~~~             
./Main.cpp:101:3: note: in expansion of macro ‘rep’
  101 |   rep(i, vec.size()) {
      |   ^~~
./Main.cpp:106:21: warning: comparison of integer expressions of different signedness: ‘long long int’ and ‘std::vector<std::pair<long long int, char> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  106 |   for (int i = 0; i < vec.size(); i++) {
      |                   ~~^~~~~~~~~~~~

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 500
Status
AC × 1
AC × 4
TLE × 5
Set Name Test Cases
Sample 01.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt
Case Name Status Exec Time Memory
01.txt AC 7 ms 3604 KiB
02.txt AC 263 ms 3452 KiB
03.txt AC 257 ms 3552 KiB
04.txt AC 667 ms 3480 KiB
05.txt TLE 2205 ms 4588 KiB
06.txt TLE 2205 ms 4580 KiB
07.txt TLE 2205 ms 4572 KiB
08.txt TLE 2205 ms 4280 KiB
09.txt TLE 2205 ms 4552 KiB