题意
对于字符串 s s s,定义 s ∞ = s s s . . . s^{\infty}=sss... s∞=sss...
给定字符串 s , t s,t s,t,判断 s ∞ s^{\infty} s∞和 t ∞ t^{\infty} t∞的字典序大小关系。
∣ S ∣ ≤ 1 0 5 |S|\le10^5 ∣S∣≤105
题解
类比 10 10 10进制中无限循环小数,如 0.233233... = 233 999 = 233 1 0 3 − 1 \displaystyle0.233233...=\frac{233}{999}=\frac{233}{10^3-1} 0.233233...=999233=103−1233
把字符串当做
26
26
26进制数,将串
s
s
s化为无限循环“小数”:
s
2
6
∣
s
∣
−
1
\displaystyle\frac{s}{26^{|s|}-1}
26∣s∣−1s
则有
s
∞
>
t
∞
⇔
s
2
6
∣
s
∣
−
1
>
t
2
6
∣
t
∣
−
1
⇔
s
⋅
2
6
∣
t
∣
+
t
>
t
⋅
2
6
∣
s
∣
+
s
⇔
s
t
‾
>
t
s
‾
s^{\infty}>t^{\infty}\Leftrightarrow\frac{s}{26^{|s|}-1}>\frac{t}{26^{|t|}-1}\Leftrightarrow s\cdot26^{|t|}+t>t\cdot26^{|s|}+s\Leftrightarrow\overline{st}>\overline{ts}
s∞>t∞⇔26∣s∣−1s>26∣t∣−1t⇔s⋅26∣t∣+t>t⋅26∣s∣+s⇔st>ts
另外两种情况同理。
单组数据时间复杂度 O ( ∣ S ∣ ) O(|S|) O(∣S∣)
#include <bits/stdc++.h>
using namespace std;
string s, t;
int main() {
while (cin >> s >> t)
if (s + t < t + s)
puts("<");
else if (s + t > t + s)
puts(">");
else
puts("=");
return 0;
}
拓展:Periodicity Lemma:两个串 s , t s,t s,t,若 s ∞ s^{\infty} s∞和 t ∞ t^{\infty} t∞的前 ∣ s ∣ + ∣ t ∣ − gcd ( ∣ s ∣ , ∣ t ∣ ) |s|+|t|-\gcd(|s|,|t|) ∣s∣+∣t∣−gcd(∣s∣,∣t∣)位都相同,则 s ∞ = t ∞ s^{\infty}=t^{\infty} s∞=t∞。