結果
| 問題 |
No.1192 半部分列
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2020-08-22 17:30:07 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 47 ms / 2,000 ms |
| コード長 | 1,544 bytes |
| コンパイル時間 | 1,659 ms |
| コンパイル使用メモリ | 174,200 KB |
| 実行使用メモリ | 30,720 KB |
| 最終ジャッジ日時 | 2024-10-15 11:20:26 |
| 合計ジャッジ時間 | 2,970 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 25 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int INF = 1000000;
int main(){
string S;
cin >> S;
string T;
cin >> T;
int N = S.size();
int M = T.size();
vector<int> p(N + 1, -1);
p[N] = M;
int ps = M - 1;
for (int i = N - 1; i >= 0; i--){
if (i < N - 1){
ps--;
}
if (ps != -1){
while (T[ps] != S[i]){
ps--;
if (ps == -1){
break;
}
}
}
if (ps == -1){
break;
} else {
p[i] = ps;
}
}
if (p[0] != -1){
cout << -1 << endl;
} else {
vector<vector<int>> next1(N + 1, vector<int>(26, N));
for (int i = N - 1; i >= 0; i--){
next1[i] = next1[i + 1];
next1[i][S[i] - 'a'] = i;
}
vector<vector<int>> next2(M + 1, vector<int>(26, M));
for (int i = M - 1; i >= 0; i--){
next2[i] = next2[i + 1];
next2[i][T[i] - 'a'] = i;
}
string ans = "";
int p1 = 0, p2 = 0;
while (1){
bool ok = false;
bool ok2 = false;
for (int i = 0; i < 26; i++){
if (next1[p1][i] != N){
if (next2[p2][i] == M){
ans += 'a' + i;
ok = true;
break;
} else {
int p3 = next1[p1][i] + 1;
int p4 = next2[p2][i] + 1;
if (p[p3] < p4){
ans += 'a' + i;
p1 = p3;
p2 = p4;
ok2 = true;
break;
}
}
}
}
if (ok || !ok2 || p1 == N){
break;
}
}
cout << ans << endl;
}
}
SSRS