http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_D&lang=jp
http://judge.u-aizu.ac.jp/onlinejudge/introduction.jsp
こちらのAIZU ONLINE JUDGEのプロコンに提出しようとしたものだが、なんかうまく採点されなかったので、ここに記しておこう(というかそもそもPHPで提出している人をほとんど見かけることができない)。
もしくはこのプログラムが想定できていないパターンがあるかもしれない。
なお、大分冗長です。
/*
$st = microtime(true);
$sm = memory_get_usage();
*/
//$arr = file($argv[1]);
$arr = str_split($stdin = trim(fgets(STDIN)));
$d = 0;
$sd = 0;
$areas = array();
$ds = array();
//print(count($arr)."\n");
for($i=count($arr)-1,$is=count($arr)-1,$continue=false;$i>=0;$i--,$continue=false) {
//print($arr[$i].",d:$d,sd:$sd\n");
switch($arr[$i]) {
case "\\":
// print("are\n");
$d++;
break;
case '/':
// print("sore\n");
$d--;
break;
case "_":
if ($d==$sd) {
//print("hoge2:sd:$sd,d:$d\n");
$sd = $d;
$is = $i -1;
$continue = true;
}
break;
}
if ($continue) continue;
if ($is >0 && $d > $sd) {
//print("hoge:is:$is,d:$d,sd:$sd\n");
$sd = $d;
$is = $i-1;
continue;
}
if ($i<count($arr)-1 && ($d==$sd || $i==0)) {
//print("cond:d:$d,sd:$sd\n");
$dorg = $d;
$d = $sd;
$_d = $sd;
$area = 0;
$b = ($dorg!=$sd)? false : true;
//print("is:$is,i:$i\n");
for($j=$is;$j>=$i;$j--) {
switch($arr[$j]) {
case "\\": $d++; break;
case '/': $d--; break;
}
if (!$b) {
if ($dorg==$d) {
$b = true;
$d = 0;
}
$_d = $d;
continue;
}
//print("calc:".$arr[$j].",d:$d,_d:$_d,area:$area\n");
if ($_d==$d) $area += abs($sd-$d)*1;
else $area += 0.5 + (max(abs($sd-$_d),abs($sd-$d))-1)*1;
$_d = $d;
}
$d = 0;
$sd = 0;
array_push($areas, $area);
$is = $i-1;
//print("====is:$is====\n");
}
}
/*
$et = microtime(true);
$em = memory_get_usage();
echo "time:".($et-$st).",memory:".($em-$sm)."\n";
*/
$out = "";
for($i=count($areas)-1;$i>=0;$i--) {
if ($out) $out .= " ";
$out .= $areas[$i];
}
$out = array_sum($areas)."\n".count($areas)." ".$out;
print($out);
ポイントはいくつがあるが、基準の深さと現在の深さとの比較、水たまりの計算のために基準の高さからで計ることとか、水たまりは必ず囲いの中で測られるものを考慮することなど。