洛谷 P1032 字串变换

天哪,巨佬 tym 都橙名了……
image

正文

本题疑似错题,不保证存在靠谱的多项式复杂度的做法。测试数据非常的各种做法都可以通过,不代表算法正确。因此本题题目和数据仅供参考
……


在一个字符串中,我们有若干种变化规则:(其中 $ n $ 是变化规则数)

  • $ A_1 \to B_1 $
  • $ A_2 \to B_2 $
  • $ \cdots \cdots $
  • $ A_n \to B_n $

问最少变几次能把 $ A $ 变成 $ B $。


爆搜!爆搜!!爆搜!!!
然后……
image
第五个数据非常的 lxl ,而第四个数据非常大的!


DFS 不行,转攻 BFS。
但是……
image

……


考虑加上 vis 数组。
这样,时间复杂度就变成了 O(玄学) 。
这样,就过了。
不过……字符串咋 vis 数组呢啊喂!
az……


办法当然还是有的,那就是——set。
贴上最终代码(请忽略珂朵莉):

#include <bits/stdc++.h>
using namespace std;

int cnt = 0;
string a[10], b[10];

string x, y;

struct node {
	string cur;
	int cnt;
	node(string a, int b) {
		cur = a;
		cnt = b;
	}
};
queue<node> q;
set<string> SSerxhs;

int main() {
	cin >> x >> y;
	string p, f;
	while (cin >> p >> f) {
		a[cnt] = p;
		b[cnt] = f;
		cnt++;
	}
	q.push(node(x, 0));
	while (q.size()) {
		node t = q.front();
		q.pop();
		if (t.cnt > 10) {
			puts("NO ANSWER!");
			return 0;
		} else if (t.cur == y) {
			printf("%d", t.cnt);
			return 0;
		}
		if (SSerxhs.count(t.cur)) {
			continue;
		}
		SSerxhs.insert(t.cur);
		for (int tp = 0; tp < cnt; tp++) {
			for (int i = 0; i + a[tp].size() <= t.cur.size(); i++) {
				if (t.cur.substr(i, a[tp].size()) == a[tp]) {
					string tmp = t.cur;
					tmp.erase(i, a[tp].size());
					tmp.insert(i, b[tp]);
					q.push(node(tmp, t.cnt + 1));
				}
			}
		}
	}
	puts("NO ANSWER!");
	return 0;
}

拜拜!

posted @ 2022-08-23 20:07  A-Problem-Solver  阅读(31)  评论(0编辑  收藏  举报