AtCoder Regular Contest #019 B問題 - こだわりの名前

Source

AtCoder Regular Contest #019
問題文

問題概要

$N$ 文字のアルファベット大文字のみから成る文字列 $A$ が与えられる.
$A$ のちょうど $1$ 文字を変更して,回文にならない文字列にする方法は何通りあるかを求める問題.

解法

$1$ 文字変更する方法は $25N$ 通りなので,そこから回文になるものを引く.
回文に成るのは,$A$ がもともと回文で,奇数長の場合は,真ん中の文字を変更する $25$ 通りと,
$A_i$ で $A$ の $i$ 文字目を表すとして,$A_i$ と $A_{N-1-i}$ が $1$ 箇所だけ違うなら,どっちかをどっちかに変更する $2$ 通り,のみ.

C++によるスパゲッティなソースコード

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define mygc(c) (c)=getchar_unlocked()
#define mypc(c) putchar_unlocked(c)

int reader(char c[]){int i,s=0;for(;;){mygc(i);if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t') break;}c[s++]=i;for(;;){mygc(i);if(i==' '||i=='\n'||i=='\r'||i=='\t') break;c[s++]=i;}return s;}
void writer(int x, char c){int i,sz=0,m=0;char buf[10];if(x<0)m=1,x=-x;while(x)buf[sz++]=x%10,x/=10;if(!sz)buf[sz++]=0;if(m)mypc('-');while(sz--)mypc(buf[sz]+'0');mypc(c);}

char A[400000];

int main(){
  int N;
  int i, mismatch = 0;
  int res = 0;

  N = reader(A);
  rep(i,N/2) if(A[i]!=A[N-1-i]) mismatch++;

  if(mismatch==0 && N%2) res += 25;
  if(mismatch==1) res += 2;
  res = 25 * N - res;

  writer(res, '\n');

  return 0;
}

Current time: 2017年07月23日15時41分59秒
Last modified: 2014年04月13日06時24分21秒 (by laycrs)
Tags: Competitive_Programming AtCoder AtCoder_Regular_Contest ARC019 ARC_B
トップページに戻る

Logged in as: unknown user (not login)

ログイン: