求助,WA20分
查看原帖
求助,WA20分
417826
某个新手楼主2022/7/11 18:20
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int n;
ull p[41];
struct str{
	vector <ull> h;
	int len;
	char input(){
		static char c;
		do c = getchar();
		while (c == ' ' || c == '\n');
		h.clear();
		h.push_back(0);
		len = 0;
		while (c != ' ' && c != '\n' && c != EOF){
			h.push_back(h[len] * 97 + c - 32);
			len++;
			c = getchar();
		}
		return c;
	}
	ull& get(){
		return h[len];
	}
	ull substr(const int &l,const int &length){
		if (l + length - 1 > len)
			return 0;
		return h[l + length - 1] - h[l - 1] * p[length];
	}
	str replace(const int &x,const int &l,const str &s){
		str ans;
		static int t,i;
		t = s.len - l;
		ans.len = len + t;
		ans.h = vector <ull> (ans.len + 1);
		h[0] = 0;
		for (i = 1;i < x;i++)
			ans.h[i] = h[i];
		for (i = x + s.len;--i >= x;)
			ans.h[i] = ans.h[x - 1] * p[i - x + 1] + s.h[i - x + 1];
		for (i = x + s.len;i <= ans.len;i++)
			ans.h[i] = ans.h[i-1] * 97 + h[i-t] - h[i-t-1] * 97;
		return ans;
	}
}s,e,a[7],b[7],t,r;
typedef map<pair<ull,int>,int> m;
m ma,mb;
pair <ull,int> Pair;
queue <str> qa,qb;
int extend(queue <str> &q,m &mapa,m &mapb,str a[],str b[]){
	t = q.front();
	q.pop();
	int i,j;
	for (i = 1;i <= t.len;i++)
		for (j = 0;j < n;j++)
			if (t.substr(i,a[j].len) == a[j].get()){
				r = t.replace(i,a[j].len,b[j]);
				q.push(r);
				Pair = make_pair(r.get(),r.len);
				mapa[Pair] = mapa[make_pair(t.get(),t.len)] + 1;
				if (mapb.count(Pair))
					return mapa[Pair] + mapb[Pair];
			}
	return -1;
}
void bfs(){
	qa.push(s);
	ma[make_pair(s.get(),s.len)] = 0;
	qb.push(e);
	mb[make_pair(e.get(),e.len)] = 0;
	int ans;
	while (!qa.empty() && !qb.empty()){
		if (ma[make_pair(qa.front().get(),qa.front().len)] + 
			mb[make_pair(qb.front().get(),qb.front().len)] > 10)
			break;
		if (qa.size() < qb.size())
			ans = extend(qa,ma,mb,a,b);
		else ans = extend(qb,mb,ma,b,a);
		if (~ans){
			cout<<ans;
			return;
		}
	}
	cout<<"NO ANSWER!";
}
int main(){
	int i;
	p[0] = 1;
	for (i = 1;i <= 40;i++)
		p[i] = p[i - 1] * 97;
	s.input();
	e.input();
	for (n = 0;a[n].input()!=EOF && b[n].input()!=EOF;n++);
	bfs();
	return 0;
}

测试点1 2 4 5 WA
但1 2在自己电脑上运行可以得到正确答案

2022/7/11 18:20
加载中...