Monday, July 13, 2015

UVa 10336 - Rank the Languages

// UVa 10336 - Rank the Languages

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;

struct pa {
	char c;
	int s;
};

bool operator <(const pa & a, const pa & b) {
	return a.s > b.s || (a.s == b.s && a.c < b.c);
}

int n, m;
vector<string> world;

void dfs(int i, int j, char c) {
	if (world[i][j] == c) {
		world[i][j] = '0';
		if (i > 0)
			dfs(i - 1, j, c);
		if (i < n - 1)
			dfs(i + 1, j, c);
		if (j > 0)
			dfs(i, j - 1, c);
		if (j < m - 1)
			dfs(i, j + 1, c);
	}
}

int main() {
	int tt;
	cin >> tt;
	for (int t = 1; t <= tt; t++) {
		cin >> n >> m;
		world.clear();
		for (int i = 0; i < n; i++) {
			string line;
			cin >> line;
			world.push_back(line);
		}

		map<char, int> states;
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
				if (world[i][j] != '0') {
					states[world[i][j]]++;
					dfs(i, j, world[i][j]);
				}

		vector<pa> sol;
		for (char c = 'a'; c <= 'z'; c++)
			if (states[c]) {
				pa p = { c, states[c] };
				sol.push_back(p);
			}
		sort(sol.begin(), sol.end());

		printf("World #%d\n", t);
		for (int i = 0; i < sol.size(); i++)
			printf("%c: %d\n", sol[i].c, sol[i].s);
	}
	return 0;
}

No comments:

Post a Comment