f,g,h= ->s,m,d{ n=s.size (n-(d ? 1:0)).downto(1).reduce(0){|r,i| i<=r&&n-i<=r&&m<=r and break r h[s[0,i]] or next r n-i<=i||n-i<=m ? g[s[i..-1]] ? [i,m].max : r : [r,f[s[i..-1],[i,m].max,false]].max } }, ->s{ s.size<2||s.size.downto(1).any?{|i|h[s[0,i]]&&g[s[i..-1]]} }, ->s{ s==s.reverse } p f[gets.chomp,0,true]