首页 > 其他分享 >洛谷P1032 [NOIP2002 提高组] 字串变换

洛谷P1032 [NOIP2002 提高组] 字串变换

时间:2024-09-05 21:26:13浏览次数:11  
标签:新串 洛谷 string NOIP2002 int P1032 str ans orginal

ac代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 15;
struct node{
	string str;
	int step;
};
string a, b;
string orginal[N];
string translated[N];
int n, ans;
 
map<string,int> ma;
 
string trans(const string &str, int i, int j){
	//初始化新串为空格 
	string ans = " ";

//	if(i + orginal[j].length() > str.length()){
//		return ans;
//	}
    
	//进行匹配 看j串是否为str的子串 
	for(int k = 0; k < orginal[j].length(); ++k){
		//如果不是返回空串 
		if(str[i + k] != orginal[j][k]){
			return ans;
		}
	}
	//进行修改操作 
	ans = str.substr(0, i);
	ans += translated[j];
	ans += str.substr(i + orginal[j].length());
	//返回修改过的新串 
	return ans;
}

void bfs(){
	queue<node>q;
	node s;
	s.str = a;
	s.step = 0;
	q.push(s);
	
	while(!q.empty()){
		node u = q.front();
		q.pop();
		string temp;
		//记录当前串是否被搜索过 
		if(ma.count(u.str) == 1){
			continue;
		}
		//如果当前串和目标串匹配 
		if(u.str == b){
			//更新答案最优步数为当前步数 
			ans = u.step;
			break;
		}
		//将当前串存入map中 
		ma[u.str] = 1;
		//遍历当前串每一位 
		for(int i = 0; i < u.str.length(); ++i){
			//遍历所有变换规则 
			for(int j = 0; j < n; ++j){
				//新串 
				temp = trans(u.str, i, j);
				//如果有新串 
				if(temp != " "){
					//将其存入队列中 
					node v;
					//新串 
					v.str = temp;
					//步数 
					v.step = u.step + 1;
					//放入队列 
					q.push(v);
				}
			}
		}
	}
	//进行最小步数判断 
	if(ans > 10 || ans == 0){
		cout<<"NO ANSWER!"<<endl;
	}else{
		cout << ans << endl;
	}
}


int main(){
	cin >> a >> b;
	while(cin >> orginal[n] >> translated[n]){
		n++;
	}
	bfs();
	return 0;
}

标签:新串,洛谷,string,NOIP2002,int,P1032,str,ans,orginal
From: https://www.cnblogs.com/lyx9785/p/18399244

相关文章

  • 洛谷 P1516 青蛙的约会 题解
    一道简单的数学题~首先分析题意。精简得出:假设跳了\(t\)次,那么青蛙A的坐标是\((x+mt)\modL\),青蛙B的坐标是\((y+nt)\modL\),列出方程:\[x+mt\equivy+nt\pmodL\]由于余数具有可减性,所以把\(y+nt\)移到左边,得出:\[x-y+mt-nt\equiv0\pmodL\]写成人话:\[(x-y+mt-nt)\mod......
  • 洛谷 P2860 Redundant Paths G
    洛谷P2860RedundantPathsG题意给定一张图,求最少添加几条边使得原图变为边双连通图。思路先将原图进行边双连通分量缩点,因为已经边双连通的子图我们不用考虑。缩点后会得到一棵树,每一条边都是桥。假定有\(k\)个叶子节点。我们可以把叶子节点两个两个配对连边形成环,这样......
  • 洛谷 P3469 BLO-Blockade
    洛谷P3469BLO-Blockade题意给定一张无向图,求每个点被封锁之后有多少个有序点对\((x,y)(x\ney,1<=x,y<=n)\)满足\(x\)无法到达\(y\)。思路使用Tarjan求出割点,有以下几种情况。当前点不是割点,答案为\(2\times(n-1)\),即该点与其他所有点不连通。当前点是割点,答案......
  • 洛谷刷题之P1046
    [NOIP2005普及组]陶陶摘苹果题目描述陶陶家的院子里有一棵苹果树,每到秋天树上就会结出101010个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个......
  • 洛谷刷题之P1009
    [NOIP1998普及组]阶乘之和题目描述用高精度计算出S=1!+2......
  • 洛谷刷题之P1226
    【模板】快速幂题目描述给你三个整数a,b,pa,b,p......
  • 洛谷 P2515 软件安装
    洛谷P2515软件安装题意现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\)。我们希望从中选择一些软件安装到一台磁盘容量为\(M\)计算机上,使得这些软件的价值尽可能大(即\(V_i\)的和最大)。但是现在有个问题:软件之间存在依赖......
  • 洛谷 P3119 Grass Cownoisseur G
    洛谷P3119GrassCownoisseurG题意约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连。奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草。贝西总是从\(1\)号草场出发,最后回到\(1\)号草场。她想经过尽可能多的草场,贝西在通一个草场只吃一次......
  • 洛谷 P9912 Zatopljenje
    洛谷P9912Zatopljenje题意给出长度为\(n\)的序列\(a\),有\(q\)次询问。每次给出\(l,r,x\),询问区间\([l,r]\)中有多少段极长的,\(a\)都大于\(x\)的段。思路离线后扫描线。先把询问和\(a\)离散化,然后扫描\(a\)的值。维护序列\(b\),初始全为\(1\)。扫描从\(......
  • 洛谷 P5340 大中锋的游乐场
    洛谷P5340大中锋的游乐场题意给出一张\(n\)个点\(m\)条边的图,每个点有一个点权\(1\)或\(-1\)。给出点\(s,t\),求出\((s,t)\)间满足以下条件的最短路。任意时刻,走过的路径上点权和均\(\in[-k,k]\)。思路分层图最短路。\(dis_{i,j}\)表示走到\(i\),点权和为\(j......