作为一只菜鸡,现在只能慢慢刷abc才能把水平提上去啊。
B题链接:http://codeforces.com/contest/385/problem/B
思路:从起点到bear的b的字符数 * 最末到这个bear的r的字符数, 之后起点更新为这个bear的e的下标。纯数学题 ,没什么好讲的,只能自己去领悟。
AC代码:
#include<stdio.h>
#include<string.h>
main()
{
int res = 0, sig = 0, len;
char str[5020];
scanf("%s", str);
len = strlen(str);
for(int i = 0; i < len - 3; i++)
{
if(!strncmp(&str[i], "bear", 4))
{
res += (i - sig + 1) * (len - i - 3);
sig = i + 1;
}
}
printf("%d\n", res);
}
C题链接:
http://codeforces.com/contest/385/problem/C
思路:用筛法把素数取出来的同时用数组把2到该节点的素数数目记录,这样在执行查询操作时就比较省时间。
AC代码:
#include<stdio.h>
#define MAXN 10000100
int nums[MAXN], nums2[MAXN], pr[MAXN];
void Prime()
{
for(int i = 2; i <= MAXN; i++)
{
nums[i] = nums[i - 1];//节点继续累加
if(!pr[i])
for(int j = i; j <= MAXN; j += i)
pr[j] = 1, nums[i] += nums2[j];//将因数中有j的数记录进去,实现节点记录
}
}
int min(int a, int b)
{
return a > b? b: a;
}
main()
{
int n, tmp;
scanf("%d", &n);
while(n--)
{
scanf("%d", &tmp);
nums2[tmp]++;
}
Prime();
scanf("%d", &n);
int n1, n2;
while(n--)
{
int res = 0;
scanf("%d %d", &n1, &n2);
n2 = min(MAXN, n2);
n1 = min(MAXN, n1 - 1);
printf("%d\n", nums[n2] - nums[n1]);
}
}