motu*2

DIV1目指して問題を解き続ける

AOJ 0108 Operation of Frequency of Appearance

概要

省略

解法

直前の状態を配列に保持して、それぞれの数を数えて配列を更新し、
直前の状態と比較する。
同じだったら終了。

sは12までだと思ってたけど違うみたい。
制約をちゃんと問題文に書いてほしいなあ。

コード

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,n)  FOR(i,0,n)

int main()
{
    int n;
    while (1) {
        int cnt[13] = { 0 };
        cin >> n;
        if (n == 0) break;
        REP(i, n) cin >> cnt[i];
        int pre[13] = { 0 };
        for(int k = 0, f = 1; ; k++, f = 1) {
            int sum[100] = { 0 };
            REP(i, n) {
                pre[i] = cnt[i];
                sum[pre[i]]++;
            }
            REP(i, n) {
                cnt[i] = sum[pre[i]];
                if (cnt[i] != pre[i]) f = 0;
            }
            if (f) {
                cout << k << endl;
                REP(i, n) {
                    if (i < n - 1) printf("%d ", cnt[i]);
                    else printf("%d\n", cnt[i]);
                }
                break;
            }
        }
    }
    return 0;
}