Particle

競技プログラミングについての雑記

Codeforces Round #135 (Div. 2)

A.
それぞれの文字がkで割り切れれば良いです。

int d[26];

int main(){
	int n;
	string s;
	cin>>n>>s;
	int l = s.size();
	if(!(l%n)){//要らない
		for(int i = 0; i < l; i++){
			d[s[i]-'a']++;
		}
		bool f = true;
		for(int i = 0; i < 26; i++){
			if(d[i]%n)f=false;
		}
		if(f){
			for(int i = 0; i < n; i++){
				for(int j = 0; j < 26; j++){
					for(int m = 0; m < d[j]/n; m++){
						printf("%c",'a'+j);
					}
				}
			}
			return 0;
		}
	}
	cout<<-1<<endl;
	
	return 0;
}

B.
9でない、一番下の桁が9になるように引き算していって、p-d以上で最小のものを求めれば良いです。

stringstream 2つも要らないような気がしますが、1つだと何故か上手く行きませんでした。

int main(){
	string s,t;
	ll p,d,ans;
	cin>>s>>d;
	t = s;
	int l = t.size();
	int pos = l-1;
	stringstream ss;
	ss<<s;
	ss>>p;
	ans = p;
	while(pos>0){
		if(t[pos]=='9'){
			pos--;
			continue;
		}
		t[pos] = '9';
		for(int i = pos-1; i >= 0; i--){
			if(t[i]>'0'){
				t[i]--;
				break;
			}else if(i==0){
				cout<<ans<<endl;
				return 0;
			}else {
				t[i]='9';
			}
		}
		stringstream st;
		st<<t;
		ll q;
		st>>q;
		if(p-q>d){
			break;
		}else{
			ans = q;
			pos--;
		}
	}
	cout<<ans<<endl;
	return 0;
}

C.
greedyで解けます。k=2のときは、ABAB...とBABA...のうち、効率の良い方を使い。
k>2のときは、同じ文字が続いているとき、1つ飛ばしで違う色にします。

int main(){
	int n,k;
	string s;
	cin>>n>>k>>s;
	if(k>2){
		int ans = 0;
		for(int i = 1; i < n-1; i++){
			if(s[i-1]==s[i]||s[i]==s[i+1]){
				if(i+2<n && s[i-1]!=s[i] && s[i]==s[i+1]&&s[i+1]==s[i+2])continue;
				else if('A'!=s[i-1]&&'A'!=s[i+1])s[i]='A';
				else if('B'!=s[i-1]&&'B'!=s[i+1])s[i]='B';
				else if('C'!=s[i-1]&&'C'!=s[i+1])s[i]='C';
				ans++;
			}
		}
		if(n==2){
			if(s[0]==s[1]){
				if('A'!=s[0])s[0]='A';
				else s[0]='B';
				ans++;
			}
		}
		cout<<ans<<endl;
		cout<<s<<endl;
	}else{
		int ans1=0,ans2=0;
		for(int i = 0; i < n; i++){
			if(i&1){
				ans1+=(s[i]=='A');
				ans2+=(s[i]=='B');
			}else{
				ans1+=(s[i]=='B');
				ans2+=(s[i]=='A');
			}
		}
		if(ans1<ans2){
			cout<<ans1<<endl;
			for(int i = 0; i < n; i++){
				if(i&1)cout<<'B';
				else cout<<'A';
			}
		}else{
			cout<<ans2<<endl;
			for(int i = 0; i < n; i++){
				if(i&1)cout<<'A';
				else cout<<'B';
			}
		}
		cout<<endl;
	}
	return 0;
}