diff --git a/src/7/31/P4316.cpp b/src/7/31/P4316.cpp new file mode 100644 index 0000000..864afbc --- /dev/null +++ b/src/7/31/P4316.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include +#include +#include +using ll = long long; + +ll n,m; +std::vector>> g; +std::vector in,out; +std::vector 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 sorted; + std::deque 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]); +} \ No newline at end of file diff --git a/src/7/31/U136947d.cpp b/src/7/31/U136947d.cpp new file mode 100644 index 0000000..efa57a8 --- /dev/null +++ b/src/7/31/U136947d.cpp @@ -0,0 +1,92 @@ +#include +#include +#include +#include +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 inS(ALPHABET_SIZE, false); + for (char c : s) { + int idx = char2idx(c); + inS[idx] = true; + } + + vector f(n + 1, 0); + vector F(n + 1, 0); + vector> G(ALPHABET_SIZE, vector(n + 1, 0)); + vector> dp(n + 1, vector(ALPHABET_SIZE, 0)); + + vector 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; +}