QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#791010#5254. DifferenceskhanhtaiTL 0ms0kbC++233.6kb2024-11-28 16:26:542024-11-28 16:26:59

Judging History

你现在查看的是最新测评结果

  • [2024-11-28 16:26:59]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2024-11-28 16:26:54]
  • 提交

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 = 1e5 + 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;
    srand(time(NULL));
    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, ord.size() - 1){
//        cout << ord[i] << ' ';
//    }
//    cout << endl;

    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;
                break;
            }
        }

        if (ch) {
            cout << ord[i] << endl;
            exit(0);
        }
    }

}
/**
Warning:
Đọc sai đề???
Cận lmao
Code imple thiếu case nào không.
Limit.
**/

詳細信息

Test #1:

score: 0
Time Limit Exceeded

input:

3585 4096 2048
ABBBBBBAABAAAAAAAAAAAAABAABABBBABABAAAAABABAAAABAABAABBABBAABAABABBABAABBABBABABABBAAAABBABAABBBBABBBAABBBBBABAABAAABAAABBBBAAAABAABAABABABABBBBBABAAABAAABBAABABBABAABBAABBAABABBBBAABAAAABAABBABAAABBAAAAAABAABBABBABAABABBBAABABBABABBBAAAAABBBABABABBAABAAAABBBBABABAABBBABABABBAABBBABAB...

output:


result: