ARCのB :回文分割
個人的にすごく苦しんだ。(同期はプログラミング始めて二ヶ月でACしてる)
偶奇に分けて、奇数なら2で割った値をに足す。
を2で割ると"偶数のペア"の数がわかるから、奇数にいくつ肉付けできるかがわかる。
(イメージは、奇数は(1+偶数)になっているから、'偶数'をすべてに足す。で再分配するペアに数がわかる。)
最後のは余り
#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<cmath> #include<utility> #include<set> #include<complex> #include<map> #define vi vector<int> #define vvi vector<vector<int> > #define ll long long int #define vl vector<ll> #define vvl vector<vector<ll>> #define vb vector<bool> #define vc vector<char> #define vs vector<string> #define ld long double #define INF 1e9 #define EPS 0.0000000001 #define rep(i,n) for(int i=0;i<n;i++) #define loop(i,s,n) for(int i=s;i<n;i++) #define all(in) in.begin(), in.end() #define MAX 9999999 using namespace std; typedef pair<int, int> pii; int main(){ string s;cin>>s; vi v(26,0);rep(i,s.size())v[s[i]-'a']++; int sum=0,ki_size=0; rep(i,26){ if(v[i]==0)continue; if(!(v[i]%2))sum+=v[i]; else { sum+=(2*(v[i]/2)); ki_size++; } } sum=sum/2; if(ki_size)cout<<2*(sum/ki_size)+1<<endl; else cout<<s.size()<<endl; }