【难度】
1/10
签到题
【题意】
给定一个字符串x,定义
x
∞
=
x
x
x
⋯
\pmb{x^\infty=xxx\cdots}
x∞=xxx⋯x∞=xxx⋯x∞=xxx⋯
你有两个字符串a,b
请你比较
a
∞
和
b
∞
a^\infty和b^\infty
a∞和b∞字典序的大小
【数据范围】
1 ≤ ∣ a ∣ , ∣ b ∣ ≤ 1 0 5 1\le|a|,|b|\le10^5 1≤∣a∣,∣b∣≤105
【样例输入】
aa
b
zzz
zz
aba
abaa
【样例输出】
<
=
>
【思路】
根据
P
e
r
i
o
d
i
c
i
t
y
L
e
m
m
a
\pmb{Periodicity\ Lemma}
Periodicity LemmaPeriodicity LemmaPeriodicity Lemma,我们只要让字符串
a
a
a与
b
b
b变成串
a
a
aa
aa与串
b
b
bb
bb
然后取
max
(
∣
a
a
∣
,
∣
b
b
∣
)
\max(|aa|,|bb|)
max(∣aa∣,∣bb∣)作为比较的次数。
每次比较后两个指针向后移位,若移动到末尾则即变为开头指针,用取模操作模拟。
然后即可从左到右比较字典序大小。若还没比出大小,则两个无穷字符串字典序相同。
【AC核心代码】
时间复杂度O(
2
max
(
∣
a
∣
,
∣
b
∣
)
2\max(|a|,|b|)
2max(∣a∣,∣b∣))
空间复杂度O(|a|+|b|)
/*
_ __ __ _ _
| | \ \ / / | | (_)
| |__ _ _ \ V /__ _ _ __ | | ___ _
| '_ \| | | | \ // _` | '_ \| | / _ \ |
| |_) | |_| | | | (_| | | | | |___| __/ |
|_.__/ \__, | \_/\__,_|_| |_\_____/\___|_|
__/ |
|___/
*/
string s1,s2;
int main()
{
///IOS;
while(cin >> s1 >> s2){
int pd=0;
int ed1=s1.size();
int ed2=s2.size();
int ed = 2*max(ed1,ed2);
for(int i=0;i<ed;++i){
if(s1[i%ed1]>s2[i%ed2]){
pd = 1;
break;
}
if(s1[i%ed1]<s2[i%ed2]){
pd=-1;
break;
}
}
if(pd==0)cout << "=" << endl;
else if(pd==1)cout << ">" << endl;
else cout << "<" << endl;
}
return 0;
}