답안 #1041709

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1041709 2024-08-02T07:19:11 Z vjudge1 Ljetopica (COI19_ljetopica) C++17
8 / 100
62 ms 8792 KB
#include <iostream>
#include <vector>
#include <set>

using namespace std;
const int N = (1<<26);
int tp[50000], mod = 1e9 + 7;
string s, l, r;

void solve1(int n, int k){
	vector<bool> Cnt(N, 0);
	int L = 0, R = 0;
	for (int i=0;i<n;i++){
		if (l[i] == '1')
			L += tp[n - i - 1];
		if (r[i] == '1')
			R += tp[n - i - 1];
	}


	long long Sum = 0;
	int KK = 1<<(n-1);
	for (int mask=0;mask<(1<<(n-1));mask++){
		// mask = 6;
		if (__builtin_popcount(mask) != k)
			continue;
		int num = 0;
		int cnt = 0;
		for (int j=0, k = n-2;j<n-1;j++, k--){
			if ((1<<k) & mask)
				cnt = cnt + 1;
			if (cnt == 2)
				cnt = 0;
			if ((cnt == 1 and s[j] == 'L') or (cnt == 0 and s[j] == 'R'))
				num += (1<<k);
			// cout<<cnt<<" "<<s[j]<<'\n';
		}

		int num2 = num;
		num += KK;
		if (num >= L and num <= R and Cnt[num] == 0){
			Sum += num;
			// cout<<num<<" "<<mask<<'\n';
		}

		Cnt[num] = 1;
		num = KK - num2 - 1;
		num += KK;
		if (num >= L and num <= R and Cnt[num] == 0)
			Sum += num/*, cout<<num<<" A "<<mask<<'\n'*/;
		Cnt[num] = 1;
		// mask = 8;
	}

	cout<<Sum<<'\n';

	exit(0);
}

int main(){
	tp[0] = 1;
	for (int i=1;i<50000;i++)
		tp[i] = (tp[i-1] + tp[i-1]) % mod;

	int n, k;
	cin>>n>>k;

	

	string p1 = "1", p2 = "1";
	cin>>s>>l>>r;
	while (l.size() < n)
		l = '0' + l;
	while (r.size() < n)
		r = '0' + r;

	if (n <= 25)
		solve1(n, k);
	
	

	for (int i=0;i<n-1;i++){
		if (s[i] == 'L')
			p1 += '0', p2 += '1';
		else
			p1 += '1', p2 += '0';
	}

	int Ans = 0;
	for (auto i : {p1, p2}){
		if (i > r or i < l)
			continue;
		for (int j=0;j<i.size();j++)
			if (i[j] == '1')
				Ans = (Ans + tp[i.size() - 1 - j]) % mod;
	}
	cout<<Ans<<'\n';

}

Compilation message

ljetopica.cpp: In function 'int main()':
ljetopica.cpp:72:18: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   72 |  while (l.size() < n)
      |         ~~~~~~~~~^~~
ljetopica.cpp:74:18: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   74 |  while (r.size() < n)
      |         ~~~~~~~~~^~~
ljetopica.cpp:93:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |   for (int j=0;j<i.size();j++)
      |                ~^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 600 KB Output is correct
2 Correct 1 ms 600 KB Output is correct
3 Correct 0 ms 604 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 0 ms 604 KB Output is correct
6 Correct 0 ms 604 KB Output is correct
7 Correct 0 ms 604 KB Output is correct
8 Correct 0 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 62 ms 8792 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 604 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 600 KB Output is correct
2 Correct 1 ms 600 KB Output is correct
3 Correct 0 ms 604 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 0 ms 604 KB Output is correct
6 Correct 0 ms 604 KB Output is correct
7 Correct 0 ms 604 KB Output is correct
8 Correct 0 ms 604 KB Output is correct
9 Incorrect 62 ms 8792 KB Output isn't correct
10 Halted 0 ms 0 KB -