QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#790965 | #5254. Differences | khanhtai | TL | 0ms | 0kb | C++14 | 3.5kb | 2024-11-28 16:14:51 | 2024-11-28 16:14:52 |
answer
#include<bits/stdc++.h>
#define int long long
#define pb push_back
#define fast ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
#define MOD 1000000007
#define inf 1e18
#define fi first
#define se second
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FORD(i,a,b) for(int i=a;i>=b;i--)
#define sz(a) ((int)(a).size())
#define endl '\n'
#define pi 3.14159265359
#define TASKNAME "differences"
using namespace std;
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
typedef pair<int,int> ii;
typedef pair<int,ii> iii;
typedef vector<int> vi;
/**
n chuỗi, độ dài m.
n * m <= 2e7. (số lượng kí tự <= 2e7)
Xác định chuỗi thứ i sao cho d(i, s) = k với mọi i.
Bây giờ trong tập của mình có 2 thằng.
Nếu distance(i, j) != K thì ta chắc chắc là 2 thằng i và j sẽ ko tồn tại trong tập. thì mình sẽ
không phải xét lại (i, j).
------------------------------------------------
N ^ 2 * M: Duyệt n chuỗi, mỗi thằng độ dài m.
N * M ^ 2:
Dù có chia căn được đi nữa thì độ phức tạp là không đủ.
--------------------------------------------------
Các thuật toán đặc biệt:
random / xác suất
Nó chỉ nằm trong 4 kí tự thôi.
Nếu như K > M / 2 thì nó tương đương với việc là giống nhau M - K vị trí.
K < M / 2 thì nó là khác nhau K vị trí
Bây giờ xác suất đẻ mình chọn được đúng cái string là 1 / N, có dặc điểm gì giúp mình tìm ra nó ko
N ^ 2 * M sẽ trở nên tốt khi N nhỏ.
N * M ^ 2 sẽ trở nên tốt khi M nhỏ.
Giả sử mình chia theo tập thì nó sẽ
Nếu mình cứ bóc 2 thằng như vậy thì có chậm quá không.
Việc so sánh thì phải làm trong O(M). Tối đa thì mình chỉ được so sánh trong O(sqrt(N)).
Tóm tắt đề:
N xâu.
Mỗi xâu độ đài M.
Mỗi xâu có 4 kí tự A, B, C, D.
khoảng cách giữa 2 xâu là số lượng kí tự khác nhau giữa chúng ở từng vị trí.
Chắc chắn tồn tại 1 xâu có khoảng cách đến các xâu còn lại là K.
Hint:
Việc xáo trộn các chuỗi là như nhau.
Với 1 chuỗi i, nếu như tồn tại j (i != j) sao cho d(i, j) = K.
**/
const int MAXN = 3e5 + 9;
string str[MAXN];
vector<int> ord;
int n, m, k;
bool getDist(int i, int j){
int same = 0, dif = 0;
FOR(t, 0, m - 1){
if (str[i][t] != str[j][t]) dif++;
else same++;
if (dif > k or same > m - k) return false;
}
return true;
}
main()
{
fast;
if (fopen(TASKNAME".inp","r")){
freopen(TASKNAME".inp","r",stdin);
freopen(TASKNAME".out","w",stdout);
}
cin >> n >> m >> k;
FOR(i, 1, n){
cin >> str[i];
ord.pb(i);
}
random_shuffle(ord.begin(), ord.end());
FOR(i, 0, (int) ord.size() - 1){
bool ch = true;
FOR(j, 0, (int) ord.size() - 1){
if (j == i) continue;
if (getDist(ord[i], ord[j]) == false) ch = false;
}
if (ch) {
cout << ord[i] << endl;
exit(0);
}
}
}
/**
Warning:
Đọc sai đề???
Cận lmao
Code imple thiếu case nào không.
Limit.
**/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
input:
3585 4096 2048 ABBBBBBAABAAAAAAAAAAAAABAABABBBABABAAAAABABAAAABAABAABBABBAABAABABBABAABBABBABABABBAAAABBABAABBBBABBBAABBBBBABAABAAABAAABBBBAAAABAABAABABABABBBBBABAAABAAABBAABABBABAABBAABBAABABBBBAABAAAABAABBABAAABBAAAAAABAABBABBABAABABBBAABABBABABBBAAAAABBBABABABBAABAAAABBBBABABAABBBABABABBAABBBABAB...