結果
| 問題 |
No.1494 LCS on Tree
|
| コンテスト | |
| ユーザー |
ぷら
|
| 提出日時 | 2021-06-16 01:32:09 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 299 ms / 2,000 ms |
| コード長 | 2,943 bytes |
| コンパイル時間 | 2,407 ms |
| コンパイル使用メモリ | 207,244 KB |
| 最終ジャッジ日時 | 2025-01-22 08:26:31 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 47 |
コンパイルメッセージ
main.cpp: In function ‘void dfs(int, int)’:
main.cpp:22:73: warning: ‘c’ may be used uninitialized [-Wmaybe-uninitialized]
22 | int it = lower_bound(tmp[c-'a'].begin(),tmp[c-'a'].end(),i)-tmp[c-'a'].begin();
| ^
main.cpp:9:10: note: ‘c’ was declared here
9 | char c;
| ^
ソースコード
#include <bits/stdc++.h>
using namespace std;
int dp[2005][2005];
vector<int>tmp[30];
vector<pair<int,char>>ki[2005];
void dfs(int n,int p) {
char c;
for(int i = 0; i < ki[n].size(); i++) {
if(ki[n][i].first == p) {
c = ki[n][i].second;
continue;
}
dfs(ki[n][i].first,n);
}
if(p == -1) {
return;
}
for(int i = 0; i <= 2000; i++) {
dp[p][i] = max(dp[p][i],dp[n][i]);
int it = lower_bound(tmp[c-'a'].begin(),tmp[c-'a'].end(),i)-tmp[c-'a'].begin();
if(it != tmp[c-'a'].size()) {
dp[p][tmp[c-'a'][it]+1] = max(dp[p][tmp[c-'a'][it]+1],dp[n][i]+1);
}
}
}
void dfs2(int n,int p) {
vector<vector<int>>mx(ki[n].size(),vector<int>(2005));
for(int i = 0; i < ki[n].size(); i++) {
for(int j = 0; j <= 2000; j++) {
mx[i][j] = max(mx[i][j],dp[ki[n][i].first][j]);
char c = ki[n][i].second;
int it = lower_bound(tmp[c-'a'].begin(),tmp[c-'a'].end(),j)-tmp[c-'a'].begin();
if(it != tmp[c-'a'].size()) {
mx[i][tmp[c-'a'][it]+1] = max(mx[i][tmp[c-'a'][it]+1],dp[ki[n][i].first][j]+1);
}
}
}
vector<vector<int>>l(ki[n].size(),vector<int>(2005)),r(ki[n].size(),vector<int>(2005));
for(int i = 0; i < ki[n].size(); i++) {
for(int j = 0; j <= 2000; j++) {
l[i][j] = mx[i][j];
r[i][j] = mx[i][j];
}
}
for(int i = 0; i < ki[n].size()-1; i++) {
for(int j = 0; j <= 2000; j++) {
l[i+1][j] = max(l[i+1][j],l[i][j]);
}
}
for(int i = ki[n].size()-1; i >= 1; i--) {
for(int j = 0; j <= 2000; j++) {
r[i-1][j] = max(r[i-1][j],r[i][j]);
}
}
for(int i = 0; i < ki[n].size(); i++) {
if(ki[n][i].first == p) {
continue;
}
for(int j = 0; j <= 2000; j++) {
int cnt = 0;
if(i) {
cnt = max(cnt,l[i-1][j]);
}
if(i+1 < ki[n].size()) {
cnt = max(cnt,r[i+1][j]);
}
dp[n][j] = cnt;
}
dfs2(ki[n][i].first,n);
}
for(int i = 0; i <= 2000; i++) {
dp[n][i] = l[ki[n].size()-1][i];
}
}
int main() {
int N;
string S;
cin >> N >> S;
for(int i = 0; i < N-1; i++) {
int u,v;
char c;
cin >> u >> v >> c;
u--;
v--;
ki[u].push_back({v,c});
ki[v].push_back({u,c});
}
for(int i = 0; i < S.size(); i++) {
tmp[S[i]-'a'].push_back(i);
}
dfs(0,-1);
int ans = 0;
for(int i = 0; i < N; i++) {
for(int j = 0; j <= S.size(); j++) {
ans = max(ans,dp[i][j]);
}
}
dfs2(0,-1);
for(int i = 0; i < N; i++) {
for(int j = 0; j <= S.size(); j++) {
ans = max(ans,dp[i][j]);
}
}
cout << ans << endl;
}
ぷら