2020暑期D1-F 思路+证明
主为自用,欢迎指正。
https://ac.nowcoder.com/acm/contest/5666/F
思路+证明:
a、b字符串可无限复制。若存在a、b可相等则输出‘=’,若不满足则判断‘>’&'<'。
字符串比较首先分等长与不等长,由于求的是存在,故若存在相等则必然等长。
(条件一,两无限字符串等长)
设len1=len(a),len2=len(b)
则令xlen1=ylen2,即求公倍数。(实际上可以写上最小,不过稍后证明内容包含,故这里扩大范围写成公倍数)
若xa==yb(a复制x次==b复制y次)
设x==y,则len1==len2,则a==b;
设x!=y,则len1!=len2,取len=len1+len2,
设,len1>len2,
因为xa=yb,则存在长度为len的相等字符串(不管是扩展再减小还是直接减小,必然存在).x*a中前len个字符组成的字符串a1,同理b1。
则前len2个a字符与前len2个b字符相等,a1[1]==b1[1],a1[1]=a1[len1+1],得,b1[1]=a1[len1+1]
同理,a1[len1+2]==b1[2]...直到a1[len1+len2]==b1[len2]
则前len2个字符串中,a1==b1==b,后len1个字符串中,a1=b1=a;
得,若存在a、b字符串存在相等得无限字符串,则必然a+b==b+a。
故亦可在此基础上作大小于的判断。
a[1] | a[2] | a[3] | a[4] | a[5] | a[len1+1] | a[len1+2] | a[len2+3] |
---|---|---|---|---|---|---|---|
b[1] | b[2] | b[3] | b[len2+1] | b[len2+2] | b[len2+3] | b[len2+4] | b[len2+5] |
#define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<algorithm> #include<iostream> #include<string.h> using namespace std; typedef long long LL; int main() { string a,b; cin>>a>>b; string a1=a+b,b1=b+a; if(a1>b1) cout<<">"; else if(a1<b1) cout<<"<"; else cout<<"="; cout<<endl; }
简单图证