0828-T2 超級幸運數
題意
給出數字 \(A\),\(B\)。求出以 \(A\),\(B\) 為兩端的數的最小值。
思路
分 \(AB\) 和 \(BA\) 兩種情況。
當 \(x\) 和 \(y\) 拼接時,\(x\) 的尾部和 \(y\) 的頭部可以合併。
如 \(132\) 和 \(231\) 合併出來為 \(13231\)。
求出 \(x\) 和 \(y\) 的最長公共前字尾即可,合併時去除。
程式碼
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll to_int(string s) {
ll res = 0;
for (auto c : s) res = res * 10 + c - '0';
return res;
}
ll solve(int A, int B) {
string a = to_string(A);
string b = to_string(B);
int len = min(a.size(), b.size());
for (int i = len - 1; i >= 0; i --) {
if (a.substr(a.size() - i - 1, i + 1) == b.substr(0, i + 1)) {
string c = a;
if (i + 1 < b.size())
c = c + b.substr(i + 1);
return to_int(c);
}
}
string c = a + b;
return to_int(c);
}
int main() {
ll A, B;
cin >> A >> B;
ll ans1 = solve(A, B);
ll ans2 = solve(B, A);
cout << min(ans1, ans2);
return 0;
}