■
問題
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<long long> VLL; typedef vector<pair<int,int>> VP; #define INF (int)(1e9) #define MAXX 1.1529215e+18 #define inf 999999 #define EPS (1e-7) #define MOD (1e9+7) #define rep(i,n) for(int i=0; i<(int)(n);i++) #define REP(i,n) for(int i=1;i<=(int)(n);i++) #define FOR(i,k,n) for(int i=(k);i<(int)(n);i++) #define ALL(a) a.begin(),a.end() #define RALL(a) a.begin(),a.end(),greater<int>() #define ROT(a) a.begin(),a.begin()+1,a.end() #define RROT(a) a.begin(),a.end()-1,a.end() #define PB push_back #define MP make_pair #define PI acos(-1.0) template<typename T1, typename T2> inline bool chmin(T1 &a, T2 b) { if (a > b) { a = b; return 1; } return 0; } template<typename T1, typename T2> inline bool chmax(T1 &a, T2 b) { if (a < b) { a = b; return 1; } return 0; } template<typename T> T gcd(T a, T b) { if (b == 0) return a; return gcd(b, a % b); } /*--------------------------------------------*/ int main(){ string s; cin >> s; s.insert(s.begin(),'a'); s.insert(s.end(),'a'); int N = s.size(); vector<pair<char,int> > t; rep(i,N){ if(s[i] != 'x'){ t.PB(MP(s[i],i)); } } int M = t.size(); int cost = 0; if(M % 2 == 0){ rep(i,M/2){ if(t[i].first != t[M-i-1].first){ cout << -1 << endl; return 0; } } for(int i = M/2;i > 1;i--){ int left = t[i-1].second - t[i-2].second-1; int right = t[M-i+1].second - t[M-i].second-1; cost += abs(left-right); } }else{ rep(i,(M-1)/2){ if(t[i].first != t[M-i-1].first){ cout << -1 << endl; return 0; } } for(int i = (M-1)/2;i > 0;i--){ int left = t[i].second - t[i-1].second-1; int right = t[M-i].second - t[M-i-1].second-1; cost += abs(left-right); } } cout << cost << endl; }
解法
まず、xを取り除いたstringが回文かどうかを判定。回文なら、それぞれ対称の位置にある文字が 1個内側の文字との間にいくつxがあるかを数え、左右で個数が違えばcostを増やした。