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;
}