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; }