题目地址
题目大意
输出给定区间有多少个数字是每一位上都只出现一次。比如1234,34265等等都是符合规则的。
解题思路
预处理给定区间的所有数字,求一个前缀和,进行查询的时候只需要输出sum[b] - sum[a-b]。
AC代码
#include <iostream>
#include <cstring>
using namespace std;
int sum[100010], vis[10];
void init()
{
for (int i=1; i<100010; i++)
{
int n = i;
bool flag = false;
memset(vis, 0, sizeof(vis));
sum[i] = sum[i-1];
while (n)
{
int t = n%10;
n/=10;
if (!vis[t])
{
vis[t] = 1;
}
else
{
flag = true;
}
}
if (!flag)
{
sum[i]++;
}
}
}
int main()
{
init();
int t;
cin >> t;
while (t--)
{
int a, b;
cin >> a >> b;
cout << sum[b] - sum[a-1] << endl;
}
return 0;
}