A
给定一个字符串,找出这个字符串中出现了多少次“tjmts”
字符串最大长度1e4
长度短,可暴力。或者kmp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX = 10009;
int main()
{
int t;
int nt[MAX];
char s[MAX], w[MAX] = "tjmts";
int i, j, len1;
int lenw = strlen(w);
i = 0;
j = -1;
nt[0] = -1;
while (i < lenw) {
if (j == -1 || w[i] == w[j]) {
nt[++ i] = ++ j;
} else {
j = nt[j];
}
}
scanf("%d",&t);
while (t --) {
int len;
scanf("%d %s", &len, s);
int ans = 0;
// int len = strlen(s);
int i = 0; j = 0;
while (i < len) {
if (s[i] == w[j] || j == -1) {
i ++; j ++;
} else {
j = nt[j];
}
if (j == lenw) {
ans ++;
j = nt[j];
}
}
printf("%d\n", ans);
}
return 0;
}
D
有一些物品,一共n种,k个人分,要求每个人分到的物品必须来自同一类,并且,这k个人分到的物品数必须是相同的,求每个人最多能分到多少物品
n最大是1000,一种物品最多1e8个,k最大1e9
没有什么直接找到答案的好办法,但对于给定的一个值容易判断是否是一个合法的值,并且如果k个人每人可以得到m个,那么m-1一定是一个合法的值,如果p是一个不合法的值,那么p+1一定不合法。n的值比较小,验证一个值是否合法的代价不大,所以,可以二分答案,答案就是所有合法值中的最大者。
坑点是答案可能是0,二分时中值如果是0,判断时就会出现除0,