一开始写了硬模拟,直到比完a.len*b.len/gcd(a.len,b.len)
位才结束。然后果不其然被大质数T掉,然后用一种投机取巧的方法过了。
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { string a, b; while (cin >> a >> b) { ll na = a.length(), nb = b.length(); int i = 0, j = 0, k = 0, n = 500000; // max(na, nb) * 5; while (a[i] == b[j]) { ++i, ++j, ++k; if (i == na && j == nb) break; if (k > n) break; if (i == na) i = 0; if (j == nb) j = 0; } if (a[i] == b[j]) puts("="); else if (a[i] > b[j]) puts(">"); else if (a[i] < b[j]) puts("<"); } return 0; }
正确做法是:
无限循环并不需要一直循环,只需要让无限循环应该具有的性质体现出来即可。
让最大长度的字符串展开二倍。这样所有的细节都会在这个新的字符串中体现。然后让小的字符串一直扩增,直到长度相同。
fromLDU武远博
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); string a, b; while (cin >> a >> b) { int na = a.length(), nb = b.length(), f = 0; if (na < nb) swap(a, b), swap(na, nb), f = 1; a += a, na += na; int t = na / nb, r = na % nb; string bb = ""; for (int i = 0; i < t; ++i) bb += b; bb += b.substr(0, r); //cout << a << endl << bb << endl; if (a < bb) { if (!f) cout << '<' << endl; else cout << '>' << endl; } else if (a == bb) cout << '=' << endl; else if (a > bb) { if (f) cout << '<' << endl; else cout << '>' << endl; } } return 0; }
这是一种等效的做法,但是要注意while循环体里语句的顺序。
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { string a, b; while (cin >> a >> b) { ll na = a.length(), nb = b.length(); int i = 0, j = 0, k = 0, n = max(na, nb) * 2; while (a[i] == b[j]) { if (k > n) break; if (i == na && j == nb) break; ++i, ++j, ++k; if (i == na) i = 0; if (j == nb) j = 0; } if (a[i] == b[j]) puts("="); else if (a[i] > b[j]) puts(">"); else if (a[i] < b[j]) puts("<"); } return 0; }
另一种做法更恐怖了:
#include <bits/stdc++.h> using namespace std; int main() { string a, b; while (cin >> a >> b) { string c = a + b, d = b + a; if (c > d) cout << ">" << endl; else if (c < d) cout << "<" << endl; else cout << "=" << endl; } return 0; }