C
-
题意: 给一个字符串,看你能找出多少个组合来形成字符串"chokudai",而且是有先后顺序的!
-
一开始想着是把每个c,h,o,k,u,d,a,i的坐标存下来,每次去更新,类似双指针,但是这一下是6,7个,感觉时间,操作上有难度,那这个时候不如去存每个的方案数~
-
那么就以f数组来记录每次的位置出现了就等于前面的方案数再加上本身
#include <iostream>
#include <cstring>
#include <algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int N = 100010, mod = 1e9 + 7;
int n;
ll f[10];
string s;
map<char, int> pos;
string t = "chokudai";
int main(){
for (int i = 0; i < 8; i++)pos[t[i]] = i;
cin >> s;
n = s.size();
for (int i = 0; i < n; i++) {
if (s[i] == 'c')f[0] += 1;
else if (pos[s[i]]) {
int x = pos[s[i]];
f[x] = (f[x] + f[x - 1]) % mod;
}
}
cout << f[7] % mod << "\n";
return 0;
}
D
- 题意 :求1城市到n城市 的最短距离 的方案数,要最短
- 就是一个简单的bfs,标记是否访问,距离更新,最后统计一下由父节点到子节点的方案数,记得取余~
#include<queue>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1000000007
const int N = 2e5 + 10;
queue<int>q;
vector <int >G[N];
vector<int>way(N,0);
vector<int>vis(N,0);
vector<int>dis(N,inf);
int main() {
int n, m; cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
q.push(1);
vis[1] = 0;
dis[1] = 0;
way[1] = 1;
while (!q.empty()) {
int u = q.front(); q.pop();
if (!vis[u]) {
vis[u] = 1;
for (int v : G[u]) {
if (dis[v] > dis[u] + 1) {
dis[v] = dis[u] + 1;
q.push(v);
way[v] = way[u];
}
else if (dis[v] == dis[u] + 1) {
way[v] = (way[v] + way[u]) % inf;
}
}
}
}
cout << way[n];
return 0;
}