社区讨论

求助!#5 MLE,结果正确,如何优化

P1032[NOIP 2002 提高组] 字串变换(疑似错题)参与者 2已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@lo8kzn48
此快照首次捕获于
2023/10/27 20:20
2 年前
此快照最后确认于
2023/10/27 20:20
2 年前
查看原帖
本地测试输出是和下载的样例一致的,用的BFS,应该是队列爆了
想问一下还能怎么优化,谢谢
(本人很蒻,KMP什么的都不会……)
(变量名可能比较奇妙,见谅)
CPP
#include<bits/stdc++.h>
using namespace std;
string a,b;//原字符串和目标字符串
int ans=15;
int cnt=0;

struct change{
	string s1,s2;
}aa[105];//可以转换的字符串对应关系
struct Node{
	string s;
	int step;
};//搜索用结构体
queue <Node> q;//搜索用队列
void bfs(){
	Node t;
	t.s=a;
	t.step=0;
	q.push(t);
	while(!q.empty()){
		t=q.front();
		q.pop();
		if(t.step>10) return;
		if(t.s==b){
			ans=t.step;
			return;
		}
		string xs=t.s;
		for(int i=0;i<cnt;i++){
			if(xs.size()>=aa[i].s1.size()){
				for(int j=0;j<xs.size()-aa[i].s1.size()+1;j++){
					bool b=1;
					for(int k=0;k<aa[i].s1.size();k++){
						if(xs[j+k]!=aa[i].s1[k]){
							int tt;
							cin>>tt;
							b=0;
							break;
						}
					}
					
					if(b==1){
						t.s=xs.substr(0,j)+aa[i].s2+xs.substr(j+aa[i].s1.size(),xs.size());
						t.step++;
						q.push(t);
						t.step--;
					}
				}
			}
		}
	}
}
//搜索写的很复杂,因为是自己写的查找子串,用find()函数的话只能返回第一个查到的位置,还要配erase(),思维上有点绕
int main(){
	cin>>a>>b;
	string xx,yy;
	while(cin>>xx>>yy){
		aa[cnt].s1=xx;
		aa[cnt].s2=yy;
		cnt++;
	}
	bfs();
	if(ans==15){
		cout<<"NO ANSWER!";
	}else{
		cout<<ans;
	}
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...