A
题意:统计字符出现的次数
/*
*@author SunLakeWalk
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <limits.h>
#include <sstream>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <set>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3, "Ofast", "inlin")
using namespace std;
#define ios ios::sync_with_stdio(false) , cin.tie(0)
#define x first
#define y second
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100010, INF = 0x3f3f3f3f, mod = 1e9 + 7, base = 131;
const double eps = 1e-6, PI = acos(-1);
char c;
string s;
int ans;
void work() {
cin >> c;
cin >> s;
for (int i = 0; i < s.size(); i ++ )
if (s[i] == c) ans ++;
cout << ans << endl;
}
int main() {
int T = 1;
// cin >> T;
while (T -- ) {
work();
}
return 0;
}
B
公式,从n倒序到0
ans = (ans * x + a[i])即可
/*
*@author SunLakeWalk
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <limits.h>
#include <sstream>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <set>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3, "Ofast", "inlin")
using namespace std;
#define ios ios::sync_with_stdio(false) , cin.tie(0)
#define x first
#define y second
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100010, INF = 0x3f3f3f3f, mod = 998244353, base = 131;
const double eps = 1e-6, PI = acos(-1);
int n, m;
LL a[N];
LL ans;
void work() {
cin >> n;
for (int i = 0; i <= n; i ++ ) cin >> a[i];
cin >> m;
while (m -- ) {
int x; cin >> x;
ans = 0;
for (int i = n; i >= 0; i -- ) {
ans = (ans * x + a[i]) % mod;
}
cout << ans << ' ';
}
}
int main() {
int T = 1;
// cin >> T;
while (T -- ) {
work();
}
return 0;
} C
双链表模板
每次向前一个节点的左侧或者右侧插入一个节点
/*
*@author SunLakeWalk
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <limits.h>
#include <sstream>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <set>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3, "Ofast", "inlin")
using namespace std;
#define ios ios::sync_with_stdio(false) , cin.tie(0)
#define x first
#define y second
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 1000010, INF = 0x3f3f3f3f, mod = 1e9 + 7, base = 131;
const double eps = 1e-6, PI = acos(-1);
/*
链表啊
*/
char s[N], t[N];
int l[N], r[N], idx;
char e[N];
void insert(int k, char c) {
e[idx] = c;
l[idx] = k, r[idx] = r[k];
l[r[k]] = idx, r[k] = idx;
idx ++;
}
void work() {
cin >> s + 1 >> t + 1;
int n = strlen(s + 1);
r[0] = 1, l[1] = 0;
idx = 2;
for (int i = 1; i <= n; i ++ ) {
if (t[i - 1] == 'L') {
insert(l[i], s[i]);
}
else if (t[i - 1] == 'R'){
insert(i, s[i]);
}
else {
insert(0, s[i]);
}
}
for (int i = r[0]; i != 1; i = r[i] ) cout << e[i];
cout << endl;
}
int main() {
int T = 1;
// cin >> T;
while (T -- ) {
work();
}
return 0;
}
D
DP
我们将当前数的所有质因子都找出来,然后判断是否有和他有公因子,同时比他大的数。
如果有,就更新答案。
为了让长度尽可能地长,我们让和他有公因的数,取当前合法的最小值。
/*
*@author SunLakeWalk
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iomanip>
#include <limits.h>
#include <sstream>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <set>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3, "Ofast", "inlin")
using namespace std;
#define ios ios::sync_with_stdio(false) , cin.tie(0)
#define x first
#define y second
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 100010, INF = 0x3f3f3f3f, mod = 1e9 + 7, base = 131;
const double eps = 1e-6, PI = acos(-1);
int n;
bool a[N];
int f[N];
void work()
{
cin >> n;
memset(a, 0, sizeof a);
memset(f, 0, sizeof f);
for (int i = 0; i < n; i ++ )
{
int x; cin >> x;
a[x] = true;
}
int ans = 0;
for (int i = 1; i <= 100000; i ++ )
{
int t = i;
if (a[i])
f[i] = max(f[i], 1), ans = max(ans, 1);
else continue;
for (int j = 2; j <= t / j; j ++ ) //枚举质因子
{
if (t % j == 0 )
{
for (int k = i + j; k <= 100000; k += j)
{
if (a[k])
{
f[k] = max(f[k], f[i] + 1);
ans = max(ans, f[k]);
break;
}
}
while (t % j == 0) t /= j;
}
}
if (t > 1)
{
int j = t;
for (int k = j + i; k <= 100000; k += j)
{
if (a[k])
{
f[k] = max(f[k], f[i] + 1);
ans = max(ans, f[k]);
break;
}
}
}
}
cout << ans << endl;
}
int main()
{
int T = 1;
cin >> T;
while (T -- )
{
work();
}
return 0;
} 
京公网安备 11010502036488号