题意描述
给你两个字符串 S , T S,T S,T,你需要给出一个由 * 与小写字母组成的字符串,需要满足以下条件:
- 其中个数小于等于小写字母的个数。
- 使用若干小写字母代替 * 使得与 S S S 相同,每个 * 可以用不同的若干小写字母代替。
- 使用若干小写字母代替 * 使得与 T T T 相同,每个 * 可以用不同的若干小写字母代替。
没有满足条件的输出 NO,否需要先输出 YES。
简要分析
不按发现,需要给出的字符串要么是 X ∗ X* X∗, ∗ X *X ∗X 或 ∗ X ∗ *X* ∗X∗,其中 X X X 代表若干小写字母,对于第三者 X X X 的长度必须大于等于 2 2 2。
随后,分类讨论即可。
代码实现
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
typedef long long ll;
const ll maxn = 1e5 + 7;
const ll INF = 1e9 + 7, MOD = 998244353;
inline ll read() {
char cCc;
ll xXx = 0, wWw = 1;
while (cCc < '0' || cCc > '9')
(cCc == '-') && (wWw = -wWw), cCc = getchar();
while (cCc >= '0' && cCc <= '9')
xXx = (xXx << 1) + (xXx << 3) + (cCc ^ '0'), cCc = getchar();
xXx *= wWw;
return xXx;
}
inline void write(ll xXx) {
if (xXx < 0)
putchar('-'), xXx = -xXx;
if (xXx > 9)
write(xXx / 10);
putchar(xXx % 10 + '0');
}
void solve() {
string s, t;
cin >> s >> t;
if (s[0] == t[0]) {
cout << "YES\n";
cout << s[0] << "*\n";
} else if (s[s.size() - 1] == t[t.size() - 1]) {
cout << "YES\n" << "*" << t[t.size() - 1] << '\n';
} else {
bool flag = false;
set<string> v1;
for (ll i = 0; i + 1 < s.size(); i++) {
v1.insert(s.substr(i, 2));
}
for (ll i = 0; i + 1 < t.size(); i++) {
if (v1.contains(t.substr(i, 2))) {
cout << "YES\n" << '*' << t.substr(i, 2) << "*\n";
flag = true;
break;
}
}
if(!flag)cout << "NO\n";
}
}
signed main() {
// freopen("code.in","r",stdin);
// freopen("code.out","w",stdout);
ll T = read();
while (T--)solve();
return 0;
}