AtCoder Regular Contest #019
問題文
$N$ 文字のアルファベット大文字のみから成る文字列 $A$ が与えられる.
$A$ のちょうど $1$ 文字を変更して,回文にならない文字列にする方法は何通りあるかを求める問題.
$1$ 文字変更する方法は $25N$ 通りなので,そこから回文になるものを引く.
回文に成るのは,$A$ がもともと回文で,奇数長の場合は,真ん中の文字を変更する $25$ 通りと,
$A_i$ で $A$ の $i$ 文字目を表すとして,$A_i$ と $A_{N-1-i}$ が $1$ 箇所だけ違うなら,どっちかをどっちかに変更する $2$ 通り,のみ.
#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: 2024年04月26日01時39分17秒
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)