B - Menghitung Palindrom
Author: Suhendry EffendyDengan panjang string tidak lebih dari 100, solusi O(n3) dengan cara bruteforce sudah cukup untuk menyelesaikan soal ini. Yang perlu kita lakukan hanya menguji semua substring yang bisa dibentuk.
Bagaimana jika panjang string tidak lebih dari 1000? Untuk ini kita perlu mengoptimasi solusi kita menjadi O(n2). Hal ini bisa dilakukan dengan melakukan bruteforce hanya pada titik tengah palindrom, kemudian diuji seberapa banyak palindrom yang bisa dibentuk dengan titik tengah tersebut (Ekspansi ke kiri dan kanan).
36 peserta berhasil menyelesaikan soal ini.
Solusi C/C++
oleh Suhendry Effendy
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
bool ispalin(char s[], int a, int b) {
while ( a <= b ) {
if ( s[a] != s[b] ) return false;
a++, b--;
}
return true;
}
int main()
{
int T;
scanf( "%d", &T );
while ( T-- ) {
char s[105];
scanf( "%s", s );
int len = strlen(s);
int ans = 0;
for ( int i = 0; i < len; i++ )
for ( int j = i; j < len; j++ )
if ( ispalin(s,i,j) ) ans++;
printf( "%d\n", ans );
}
return 0;
}
Solusi PASCAL
oleh Eko Wibowo
function ispalin(s:string; a, b:longint): boolean;
begin
while ( a <= b ) do
begin
if ( s[a] <> s[b] ) then
begin
ispalin := false;
exit;
end;
a := a + 1;
b := b - 1;
end;
ispalin := true;
end;
var
T, i, j, len, ans: longint;
s: string;
begin
readln(T);
while ( T > 0 ) do
begin
T := T - 1;
readln(s);
len := length(s);
for i := 1 to len do
for j := i to len do
if ( ispalin(s,i,j) ) then ans := ans + 1;
writeln(ans);
end;
end.