Codeforces Round #657 (Div. 2) A、B题解

今天的CF真的自闭。
Codeforces Round #657 (Div. 2) A、B题解_第1张图片

1379 A. Acacius and String

题意:给定一个字符串,含有小写字母和?。可以把?替换成任意小写字母,要判断字符串中’abcba’这个字串是否有且只有出现过一次。

思路:暴力查找,先判断原本字符串中’abcba’出现的次数,如果大于1次,则输出no。如果等于一次就输出‘yes’。否则就对字符串进行修改。再判断

#include
using namespace std;
 
long long l, r, m;
bool check(long long n) {
	if (n >= l && n <= r)return true;
	else return false;
}
string s = "abacaba";
int find(string str) {
	int i, j;
	int cnt = 0;
	for (i = 0; i <= str.size()-7; i++) {
		int flag = 1;
 
		for (j = 0; j < 7; j++) {
			if (s[j] != str[i + j]) {
				flag = 0;
				break;
			}
		}
		if (flag)
			cnt++;
	}
	return cnt;
}
 
int main() {
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		string str;
		cin >> str;
		int cnt = find(str);
		int i, j;
		if (cnt > 1) {
			cout << "No" << endl;
			continue;
		}
		if (cnt == 1) {
			cout << "Yes" << endl;
			for (i = 0; i < str.size(); i++) {
				if (str[i] != '?')cout << str[i];
				else cout << 'z';
			}
			cout << endl;
			continue;
		}
		
		string tmp = str;
		int flag1 = 1;
		for (i = 0; i <= str.size()-7; i++) {
			int flag = 1;
			str = tmp;
			for (j = 0; j < 7; j++) {
				if ( str[i + j] == '?') str[i + j] = s[j];
				if ( str[i + j] != s[j])flag = 0;
			}
			if (flag) {
				cnt = find(str);
				if (cnt == 1) {
					flag1 = 0;
					cout << "Yes" << endl;
					for (i = 0; i < str.size(); i++) {
						if (str[i] != '?')cout << str[i];
						else cout << 'z';
					}
					cout << endl;
				}
 
				if (flag1 == 0)break;
			}
		}
		if (flag1) {
			cout << "No" << endl;
		}
		
	}
	return 0;
}

1379 B. Dubious Cyrpto

题意:有三个整数a,b,c。满足l<=a,b,c<=r 还有一个整数m=n*a+b-c。n是严格大于0的正整数。题面给定l,r,m。要求出a,b,c的值

思路:枚举a。当m%a或者a-m%a <=r-l时。则可以求出a,b,c的值。m%a或者a-m%a相当与b-c的值。具体如下图所示。又因为n只能是大于等于1的正整数。所以判断的时候,应该先判断a-m%a的情况。因为这种情况下n一定是大于等于1的。

Codeforces Round #657 (Div. 2) A、B题解_第2张图片

#include
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	int t;
	cin >> t;
	while (t--) {
		long long l, r, m;
		cin >> l >> r >> m;
		long long tmp = m / l;
		long long a, b, c;
		long long i, j;
		c = l;
		for (i = l; i <= r; i++) {
			a = i;
			long long det1 = m % a;
			long long det2 = a - m % a;
			if (det2 <= r - l) {
				
				b = l;
				c = l + det2;
				break;
			}
			else if (det1 <= r - l) {
				c = l;
				b = l + det1;
				break;
			}
		}
		cout << a << ' ' << b << ' ' << c << endl;
	}
	return 0;
}

你可能感兴趣的:(ACM,codeforces)