SRM 317 Div1 Easy PalindromicNumbers

問題概要

ある数nが回文数であるとは、nの数字を逆順に並べて書いた数n'がnと等しくなるような数である。(例:121, 987656789)

lower以上upper以下の回文数の数を求めよ。ただしlower≦upper≦10^9である。

解法

10^9個の整数に対して回文判定をするとTLEになってしまう。(と思うけど)

回文を直接生成するようにすればO(sqrt(n))になるので、ナイーブにそれを実装すればよい。
奇数桁、偶数桁の回文数にわけてそれぞれを生成する。

ソースコード
	int countPalNums(int lower, int upper) 
	{
		pw[0]=1;
		rep(i,9)pw[i+1]=pw[i]*10;
		
		return calc(upper)-calc(lower-1);
	}
	int calc(int n)
	{
		int cnt=0;
		//11
		for(int d=1;;d++)
		{
			int t=pw[d-1];
			for(;t<pw[d];t++)
			{
				if(t*pw[d]+rev(t)>n)goto OUT1;
				cnt++;
			}
		}
		OUT1:;
		//121
		for(int d=1;;d++)
		{
			int t=pw[d-1];
			for(;t<pw[d];t++)
			{
				if(t*pw[d-1]+rev(t/10)>n)goto OUT2;
				cnt++;
			}
		}
		OUT2:;
		return cnt;
	}
	int rev(int n)
	{
		int d[10],nd;
		
		for(nd=0;n;n/=10)d[nd++]=n%10;
		rep(i,nd)n*=10,n+=d[i];
		
		return n;
	}
System Test

Passed.大きいケースで6msほど。