Problem:
問題 B : (iwi)
20XX 年の今，G○○gle 社の世界的な支配により，人々のコミュニケーションは限られており，
例えば，自由に人と情報をやりとりすることは基本的に許されていない．
特に，過去にプログラミングコンテストで名を馳せた強豪たちは，危険と判断され，
お互いバラバラにされ，密かに注意深く監視されているという．
自分も，そんな一人であった，ような気がする．
しかし実は，自分は記憶を失ってしまっているのだ．
自分が何と名乗っていたか，それすらも思い出せない．
'i' とか 'w' とか括弧とかを使っていた気がするが，
それっぽいものを書きだしてみても，しっくりこない．
そういえば，今思い出したことには，左右に線対称だった気がするのだ．
問題
'i', 'w', '(', ')' からなる文字列が与えられた時，
一部の文字を他の文字に置き換えて，'i', 'w', '(', ')' からなる左右に線対称な文字列にしたい．
文字の追加や削除は許さず，1 文字を別の 1 文字に変える操作のみを行うことにする．
少なくとも何文字置き換えなければならないかを出力するプログラムを作成せよ．
ここで用いる左右に線対称の定義は，以下とする．
以下の文字列は左右に線対称．
空文字列
"i"
"w"
文字列
x
が左右に線対称のとき，以下の文字列も左右に線対称．
"i"
x
"i"
"w"
x
"w"
"("
x
")"
")"
x
"("
以上のもののみが左右に線対称．
ここで，"i"
x
"i" とは "i" と
x
と "i" を連結したものを表す．
他のものも同様である．
入力
入力は 'i', 'w', '(', ')' からなる 1 つの文字列である．
出力
置き換えなければならない文字数を表す整数を出力せよ．
制約
入力の文字列の長さは 10 以下である．
入出力例
入出力例 1
入力例 1:
(iwi)
入力例 1 に対する出力例:
0
入力例 1 では文字列がはじめから左右に線対称である．
入出力例 2
入力例 2:
ii(((((ww
入力例 2 に対する出力例:
5
入力例 2 では例えば ww((i))ww 等に変更すればよい．

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(i, n) for(ll i = 0; i < (n); i++)
#define reps(i, l, r) for(ll i = (l); i < (r); i++)
#define endl "\n";
#define all(a) (a).begin(), (a).end()
const ll INF = 2e18;
const ll mod1 = 1000000007;
const ll mod2 = 998244353;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
void solve() {
  string S; cin >> S;
  ll N = (ll)S.size();
  vector<char>C(N);
  ll Max = 1;
  rep(i, N) Max *= 4;
  vector<char>c = {'i', 'w', '(', ')'};
  ll ans = Max;
  rep(i, Max) {
    ll tmp = i;
    rep(j, N) {
      C[j] = c[tmp % 4];
      tmp /= 4;
    }
    bool check = true;
    rep(j, N) {
      if (C[j] == 'i' && C[N - j - 1] == 'i') continue;
      if (C[j] == 'w' && C[N - j - 1] == 'w') continue;
      if (C[j] == '(' && C[N - j - 1] == ')') continue;
      if (C[j] == ')' && C[N - j - 1] == '(') continue;
      check = false;
    }
    if (check) {
      ll sum = 0;
      rep(j, N) {
        sum += (S[j] != C[j]);
      }
      ans = min(ans, sum);
    }
  }
  cout << ans << endl;
}
signed main() {
	ll T = 1;
	//cin >> T;
	while (T--) solve();
}
accuracy: 1
time_ms: 40
memory_kb: 3400
final_rank: 3

code_snippet: //#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define N 205
//#define mod 998244353
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define ld long double
#define ls (rt<<1)
#define rs ((rt<<1)|1)
#define SZ(x) (int)(x.size())
#define debug cout<<endl<<"ff"<<endl
#define YES cout<<"YES"<<endl
#define NO cout<<"NO"<<endl
#define fi first
#define se second
#define INF 1e9
#define pq priority_queue
#define rep(x,a,b) for(int x=a;x<=b;x++)
/*int qpow(int a,int b){
	int res=1;
	for(;b;b>>=1){
		if(b&1) res=res*a%mod;
		a=a*a%mod;
	}
	return res;
}
int fac[N],ifac[N];
int C(int n,int m){
	if(m>n||m<0||n<0) return 0;
	return fac[n]*ifac[n-m]%mod*ifac[m]%mod;
}
void init(){
	fac[0]=1;
	for(int i=1;i<N;i++) fac[i]=fac[i-1]*i%mod;
	ifac[N-1]=qpow(fac[N-1],mod-2);
	for(int i=N-2;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
}*/
/*struct node{
	int nxt,to;
}e[N<<1];
int cnt,head[N];
inline void add(int x,int y){
	e[++cnt].nxt=head[x];
	head[x]=cnt;
	e[cnt].to=y;
}*/
inline int lowbit(int x){return x&(-x);}
inline int read(){
    int x=0,t=1;char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') t=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch-'0');
        ch=getchar();
    }
    return x*t;
}
inline void write(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>=10) write(x/10);
	putchar(x%10+'0');
}
int n,ans=INF,p[11];
char a[4]={'(',')','i','w'};
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	string s;
	cin>>s;n=s.size();
	s=" "+s;
	p[0]=1;for(int i=1;i<11;i++) p[i]=p[i-1]*4;
	for(int i=0;i<p[n];i++){
		string t="";
		for(int j=0;j<n;j++)
			t=t+a[(i/p[j])%4];
		int fl=0,val=0;
		t=" "+t;
		for(int i=1;i<=(n+1)/2;i++){
			int j=n-i+1;
			if(t[i]!='('&&t[i]!=')'){
				if(t[i]!=t[j]){
					fl=1;
					break;
				}
			}
			else{
				if(t[i]=='('&&t[j]==')');
				else{
					fl=1;
					break; 
				}
			}
		}
		if(fl) continue;
		for(int i=1;i<=n;i++)
			if(s[i]!=t[i])
				val++;
		ans=min(ans,val);
	}
	cout<<ans<<endl;
	return 0;
}
accuracy: 0.75
time_ms: 180
memory_kb: 3444
final_rank: 5

code_snippet: #include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a)  (a).begin(),(a).end()
#define pb push_back
#define INF 99999999
#define eps 1e-9
int l;
int mini;
string str;

bool isOK(string s){
    if(s.size()%2!=0){
        if(s[(int)(s.size()/2)]=='('||s[(int)(s.size()/2)]==')')return false;
        s=s.substr( 0,(int)(s.size()/2) )+s.substr( (int)((s.size()+1)/2),(int)(s.size()/2));
    }
    string a,b;
    a=s.substr( 0,(int)(s.size()/2) );
    b=s.substr( s.size()/2,(int)(s.size()/2) );
    reverse(b.begin(),b.end());
    rep(i,b.size()){
        if(  (a[i]==b[i]&&a[i]!=')'&&a[i]!='(')||( (a[i]==')'&&b[i]=='(') || (a[i]=='('&&b[i]==')') )  ){}
        else{
            return false;
        }
    }
    return true;
}

int solve(string a,string b){
    int ret=0;
    rep(i,a.size()){
        if(a[i]!=b[i])ret++;
    }
    
    return ret;
}

void dfs(string s){
    if(s.size()==l){
        if(isOK(s)){
            mini=min(mini,solve(s,str));
        }
        return ;
    }
    string iwi="iw()";
    rep(i,4){
        dfs(s+iwi[i]);
    }
}


int main(){
    mini=INF;
    cin>>str;
    l=str.size();
    
    dfs("");
    cout<<mini<<endl;
}
accuracy: 1
time_ms: 220
memory_kb: 1196
final_rank: 4

code_snippet: #define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
 
using namespace std;
 
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P > PP;
 
int tx[] = {0,1,0,-1};
int ty[] = {-1,0,1,0};
 
static const double EPS = 1e-8;

static const char iwi[] = {'i','w','(',')'};

int FastPow(int x,int power){
  int res = 1;
  while(power){
    if(power & 1) res *= x;
    x *= x;
    power >>= 1;
  }
  return res;
}

bool isClear(char buf[12]){
  if(strlen(buf) % 2 != 0
     && (buf[strlen(buf) / 2] == '('
	 || buf[strlen(buf) / 2] == ')')) return false;
  for(int i=0,j=strlen(buf)-1;i<strlen(buf)/2;i++,j--){
    if(buf[i] == '(' && buf[j] != ')') return false;
    else if(buf[i] == ')' && buf[j] != '(') return false;
    else if(buf[i] == 'i' && buf[j] != 'i') return false;
    else if(buf[i] == 'w' && buf[j] != 'w') return false;
  }
  return true;
}

int CountFlag(int S){
  int res = 0;
  while(S){
    if(S & 1) res++;
    S >>= 1;
  }
  return res;
}

int main(){
  char buf[12];
  while(~scanf("%s",buf)){
    int upper = FastPow(4,strlen(buf));

    int min_modify_count = INF;
    for(int S=0;S<=upper;S++){
      int tmp_S = S;
      char tmp_buf[12];
      
      int modify_count = 0;
      memset(tmp_buf,'\0',sizeof(tmp_buf));
      strcpy(tmp_buf,buf);

      for(int i=0;i<strlen(tmp_buf);i++){
	if(buf[i] != iwi[tmp_S % 4]) modify_count++;
	tmp_buf[i] = iwi[tmp_S % 4];
	tmp_S /= 4;
      }

      if(!isClear(tmp_buf)) continue;

      min_modify_count = min(modify_count,min_modify_count);
    }
    printf("%d\n",min_modify_count);
  }
}
accuracy: 1
time_ms: 100
memory_kb: 1148
final_rank: 2

code_snippet: #define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
 
using namespace std;
 
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P > PP;
 
int tx[] = {0,1,0,-1};
int ty[] = {-1,0,1,0};
 
static const double EPS = 1e-8;

static const char iwi[] = {'i','w','(',')'};

int FastPow(int x,int power){
  int res = 1;
  while(power){
    if(power & 1) res *= x;
    x *= x;
    power >>= 1;
  }
  return res;
}

bool isClear(char buf[12]){
  if(strlen(buf) % 2 != 0
     && (buf[strlen(buf) / 2 + 1] == '('
	 || buf[strlen(buf) / 2 + 1] == ')')) return false;
  for(int i=0,j=strlen(buf)-1;i<strlen(buf)/2;i++,j--){
    if(buf[i] == '(' && buf[j] != ')') return false;
    else if(buf[i] == ')' && buf[j] != '(') return false;
    else if(buf[i] == 'i' && buf[j] != 'i') return false;
    else if(buf[i] == 'w' && buf[j] != 'w') return false;
  }
  return true;
}

int CountFlag(int S){
  int res = 0;
  while(S){
    if(S & 1) res++;
    S >>= 1;
  }
  return res;
}

int main(){
  char buf[12];
  while(~scanf("%s",buf)){
    int upper = FastPow(4,strlen(buf));

    int min_modify_count = INF;
    for(int S=0;S<=upper;S++){
      int tmp_S = S;
      char tmp_buf[12];
      
      int modify_count = 0;
      memset(tmp_buf,'\0',sizeof(tmp_buf));
      strcpy(tmp_buf,buf);

      for(int i=0;i<strlen(tmp_buf);i++){
	if(buf[i] != iwi[tmp_S % 4]) modify_count++;
	tmp_buf[i] = iwi[tmp_S % 4];
	tmp_S /= 4;
      }

      if(!isClear(tmp_buf)) continue;

      min_modify_count = min(modify_count,min_modify_count);
    }
    printf("%d\n",min_modify_count);
  }
}
accuracy: 0.65
time_ms: 20
memory_kb: 1148
final_rank: 6

code_snippet: #include <iostream>
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

string str;
int ans = 20;
char c[] = { 'i' , 'w' , '(' , ')' };

char f(char c){
    if( c == '(' )
        c = ')';
    else if( c == ')' )
        c = '(';
    return c;
}

bool check(string s){
    bool flag = true;
    for(unsigned int i=0 ; i<s.size()/2 ; ++i ){
        if( s[i] != f(s[s.size()-i-1]) ){
            flag = false;
        }
    }
    if( (s.size() % 2) == 1 ){
        int i = s.size()/2;
        if( s[i] == ')' || s[i] == '(' ){
            flag = false;
        }
    }
    return flag;
}




int def(string s){
    int cnt = 0;
    for(int i=0 ; i<s.size() ; ++i ){
        if( str[i] != s[i] )
            cnt++;
    }
    return cnt;
}

void solve(string s, int i){
    if( i == s.size()-1 ){
        if( check(s) ){
            ans = min( ans , def(s) );
        }
    }else if( i < s.size() ){
        s[i] = c[0];
        solve( s , i+1 );
        s[i] = c[1];
        solve( s , i+1 );
        s[i] = c[2];
        solve( s , i+1 );
        s[i] = c[3];
        solve( s , i+1 );
    }
}
int main(){
    cin >> str;
    solve( str , 0 );
    cout << ans << endl; 
}
accuracy: 1
time_ms: 80
memory_kb: 880
final_rank: 1