66pts求救
查看原帖
66pts求救
743373
Vitamin_B楼主2023/10/5 09:19

link

代码:

//# pragma GCC optimize("Ofast,no-stack-protector")
//
//# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

# include <bits/stdc++.h>

# define reg register

typedef long long ll;

using namespace std;

# define x a[i][j]

int n, m, l[30], r[30], d[30], u[30], du[30], a[35][35], tot;

string s, ans;

bool vis[30][30], f[30];

void dfs (int step) {
//	cout << ans << ':' << du[2] << '\n';
	if (step >= tot) {

		cout << ans << '\n';

		return ;

	}

	for (reg int i = 0; i < 26; ++ i)
		if (f[i] && ! du[i]) {

			for (reg int j = 0; j < 26; ++ j)
				if (vis[i][j])
					-- du[j];

			ans[step] = i + 'A';

			f[i] = 0;

			dfs (step + 1);

			f[i] = 1;

			for (reg int j = 0; j < 26; ++ j)
				if (vis[i][j])
					++ du[j];

		}

	return ;

}

int main () {

	ios::sync_with_stdio (0);

	cin.tie (0);

	cout.tie (0);

//	freopen ("frame.in", "r", stdin);
//
//	freopen ("frame.out", "w", stdout);

	cin >> n >> m;

	for (reg int i = 0; i < 26; ++ i)
		u[i] = l[i] = 114514;

	for (int i = 0; i < n; ++ i) {

		cin >> s;

		for (int j = 0; j < m; ++ j)
			if (s[j] != '.') {

				a[i][j] = s[j] - 'A';

				if (! f[x])
					f[x] = 1, ++ tot;

				l[x] = min (l[x], j);

				r[x] = max (r[x], j);

				if (u[x] > n)
					u[x] = i;

				d[x] = i;

			} else
				a[i][j] = -1;

	}

	for (reg int i = 0; i < 26; ++ i)
		if (f[i]) {

			for (reg int j = l[i]; j <= r[i]; ++ j) {

				if (~ a[u[i]][j] && ! vis[i][a[u[i]][j]] && a[u[i]][j] != i)
					vis[i][a[j][u[i]]] = 1;

				if (~ a[d[i]][j] && ! vis[i][a[d[i]][j]] && a[d[i]][j] != i)
					vis[i][a[j][d[i]]] = 1;

			}

			for (reg int j = u[i] + 1; j < d[i]; ++ j) {

				if (~ a[j][l[i]] && ! vis[i][a[j][l[i]]] && a[j][l[i]] != i)
					vis[i][a[j][l[i]]] = 1;

				if (~ a[j][r[i]] && ! vis[i][a[j][r[i]]] && a[j][r[i]] != i)
					vis[i][a[j][r[i]]] = 1;

			}

		}

	for (reg int i = 0; i < 26; ++ i)
		if (f[i])
			for (reg int j = 0; j < 26; ++ j)
				du[i] += vis[j][i];
//	for (reg int i = 0; i < 5; ++ i, cout << '\n') for (reg int j = 0; j < 5; ++ j) cout << vis[i][j] << ' ';
	ans.resize (tot, '.');
//	for (reg int i = 0; i < 5; ++ i) cout << "du[" << i << "]=" << du[i] << '\n';
	dfs (0);

	return 0;

}

第7个数据.in:

30 30
...............OOOOO..........
...............O...O..........
...............O...O..........
...............O...O..........
...............O...O..........
...............O...O..........
...............O...O..........
EEEEEEEEEEEEEEEOEEEOEEEEEEEEEE
E..............OOOOO.........E
E............................E
EEIIUUUUUUUUUUUUUUUUUUUUUUUUEE
..I.U...I..............AAAAUA.
..I.U...I..............A...UA.
..I.U...I..............A...UA.
..I.UUUUUUUUUUUUUUUUUUUUUUUUA.
..I.....I..............A....A.
..I.....I..............A....A.
..I.....I..............AAAAAA.
..I.....I.....................
..I.....I.....................
..I.....I.....................
..IIIIIII.....................
..............................
..............................
..............................
..............................
..............................
..............................
..............................
..............................

第7个数据.out

AEIOU
AEIUO
AEOIU
EAIOU
EAIUO
EAOIU
EIAOU
EIAUO
EIOAU
EOAIU
EOIAU

我输出为空?

2023/10/5 09:19
加载中...