This commit is contained in:
Zengtudor 2025-08-01 11:26:39 +08:00
parent 3aafc65dc3
commit bdcbb82f46
2 changed files with 144 additions and 0 deletions

52
src/7/31/P4316.cpp Normal file
View File

@ -0,0 +1,52 @@
#include <cstdio>
#include <deque>
#include <iostream>
#include <istream>
#include <ranges>
#include <tuple>
#include <vector>
using ll = long long;
ll n,m;
std::vector<std::vector<std::tuple<ll,ll>>> g;
std::vector<ll> in,out;
std::vector<double> dp;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m;
g.resize(n+1);
in.resize(n+1);
out.resize(n+1);
for(ll i=1;i<=m;i++){
ll u,v,w;
std::cin>>u>>v>>w;
in[v]++;
out[u]++;
g[u].emplace_back(v,w);
}
std::vector<ll> sorted;
std::deque<ll> q;
for(ll i=1;i<=n;i++){
if(!in[i]){
q.push_back(i);
}
}
while(q.size()){
ll top = q.front();
q.pop_front();
sorted.push_back(top);
for(auto [v,w]:g[top]){
if(!--in[v])q.push_back(v);
}
}
dp.resize(n+1);
for(ll u:std::views::reverse(sorted)){
if(u==n)continue;
for(auto[v,w]:g[u]){
dp[u]+=(dp[v]+w)/out[u];
}
}
printf("%.2lf\n",dp[1]);
}

92
src/7/31/U136947d.cpp Normal file
View File

@ -0,0 +1,92 @@
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int MOD = 1000000007;
const int ALPHABET_SIZE = 27; // 26 letters + '_'
int char2idx(char c) {
if (c == '_')
return 26;
return c - 'a';
}
int main() {
int n, k;
string s;
cin >> n >> k;
cin >> s;
vector<bool> inS(ALPHABET_SIZE, false);
for (char c : s) {
int idx = char2idx(c);
inS[idx] = true;
}
vector<long long> f(n + 1, 0);
vector<long long> F(n + 1, 0);
vector<vector<long long>> G(ALPHABET_SIZE, vector<long long>(n + 1, 0));
vector<vector<long long>> dp(n + 1, vector<long long>(ALPHABET_SIZE, 0));
vector<int> last_occurrence(ALPHABET_SIZE, -1);
f[0] = 1;
F[0] = 1;
for (int c = 0; c < ALPHABET_SIZE; ++c) {
dp[0][c] = 0;
G[c][0] = 0;
}
for (int i = 1; i <= n; ++i) {
int L = max(0, i - k);
int R = i - 1;
char current_char = s[i - 1];
int current_idx = char2idx(current_char);
for (int c = 0; c < ALPHABET_SIZE; ++c) {
if (!inS[c]) {
dp[i][c] = 0;
continue;
}
int Rc = -1;
if (c == current_idx) {
Rc = i - 1;
} else {
Rc = last_occurrence[c];
}
if (Rc < L) {
dp[i][c] = 0;
} else {
long long part1 = F[Rc] - (L - 1 >= 0 ? F[L - 1] : 0);
long long part2 = G[c][Rc] - (L - 1 >= 0 ? G[c][L - 1] : 0);
dp[i][c] = (part1 - part2) % MOD;
if (dp[i][c] < 0) dp[i][c] += MOD;
}
}
f[i] = 0;
for (int c = 0; c < ALPHABET_SIZE; ++c) {
if (inS[c]) {
f[i] = (f[i] + dp[i][c]) % MOD;
}
}
last_occurrence[current_idx] = i - 1;
F[i] = (F[i - 1] + f[i]) % MOD;
for (int c = 0; c < ALPHABET_SIZE; ++c) {
if (inS[c]) {
G[c][i] = (G[c][i - 1] + dp[i][c]) % MOD;
} else {
G[c][i] = G[c][i - 1];
}
}
}
cout << f[n] % MOD << endl;
return 0;
}