UVA - 1262 Password (注意空集的特殊情况)

收获:

1. 应该从审题的时候就要留意特殊情况的判断,并且最好要将它们列出来,不然后面的代码实现之后很容易忘掉。

2. 有时候序号从1开始的要求转换成从0开始会更好操作。例如 1 2 3 | 4 5 6, 这两组,问3在哪一组,1/3 = 2/3 != 3/3,可见同一组的数同时用除法向下取整的函数无法得到同一个值,将导致错误。

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
using namespace std;

const int maxk = 7777 + 3;
int T, K;
set<char>s[5];
int a[5];

void solve()
{
    K--;
    int b[5]; b[4] = 1;
    for(int i = 3; i >= 0; i--){
        b[i] = b[i+1]*s[i+1].size();
        //cout << b[i] << endl;
    }
    vector<int>idx;
    for(int i = 0; i < 5; i++){
        if(K/b[i] >= s[i].size()){
            cout << "NO" <<endl;
            return ;
        }
        idx.push_back(K/b[i]);
        K %= b[i];
    }
    string ans;
    _for(i,0,5){
        set<char>::iterator it = s[i].begin();
        while(idx[i]--)
            it++;
        ans.push_back(*it);
    }
    cout << ans << endl;
}

int main()
{
//    freopen("in.txt", "r",stdin);
//    freopen("out.txt", "w",stdout);
    cin >> T;
    while(T--){
        set<char>s1[5];
        set<char>s2[5];
        cin >> K;
        _for(i,0,6){
            string str;
            cin >> str;
            _for(j,0,5)
                s1[j].insert(str[j]);
        }
        _for(i,0,6){
            string str;
            cin >> str;
            _for(j,0,5)
                s2[j].insert(str[j]);
        }
        bool ok = true;
        _for(i,0,5){
            s[i].clear();
            set_intersection(s1[i].begin(), s1[i].end(), s2[i].begin(), s2[i].end(), inserter(s[i], s[i].begin()));
            if(s[i].size() == 0){
                ok = false;
                break;
            }
//            for(char c : s[i])
//                cout << c;
//            cout << endl;
        }
        if(ok)
            solve();
        else
            cout << "NO" << endl;
    }
    return 0;
}

  

 

posted on 2019-03-09 14:55  nbsanshi  阅读(94)  评论(0编辑  收藏  举报

导航