Member SRM 465 DIV2 Easy

NumberNeighbours


ある2つの数について、各桁の数の順列が一致する(leading zeroは無視)とき
Neibouring Numberであるという。
例えば、40020と204はそれぞれの順列00042と042で一致するのでNeighbouring Numberである。
いくつかの数がvectorで与えられるので、Neighbouring Numberの組は何個あるか答える。

方針


とりあえずforを2回回して全ての組み合わせを試す。
for(i)for(j)の中でnumbers[i]、numbers[j]を文字列に変換してごにょごにょ…

numbers[i]、numbers[j]を文字列に変換したs1とs2にnext_permutation()を使って
順列生成しながらatoi()で一致判定。。。とか考えたけどO(s1.size()!*s2.size()!)でTLE必至。


う〜ん。。。


上の方針で進めてた過程で、next_permutation()を使うなら
最小の順列(40020なら00024)を生成する必要があって、sort()を使ってみた。


…あれ?


これを比較すればよくね?w
s1="40020", s2="204"なら

sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
// これでs1="00024", s2="024"
if (atoi(s1.c_str()) == atoi(s2.c_str())) ++result;

でおk!

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cfloat>
#include <map>
#include <utility>
#include <set>
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <sstream>
#include <complex>
#include <stack>
#include <queue>
using namespace std;
static const double EPS = 1e-5;
typedef long long ll;

class NumberNeighbours {
public:
    int numPairs(vector <int> numbers) {
        int result = 0;
        for (int i = 0; i < numbers.size(); ++i) {
            for (int j = i+1; j < numbers.size(); ++j) {
                stringstream ss1, ss2;
                ss1 << numbers[i], ss2 << numbers[j];
                string s1, s2;
                ss1 >> s1, ss2 >> s2;
                sort(s1.begin(), s1.end());
                sort(s2.begin(), s2.end());
                if (atoi(s1.c_str()) == atoi(s2.c_str())) ++result;
            }
        }
        return result;
    }
};

stringstream使うのにid:ororogの日記参照してたら20分くらいかかったん