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

[NOIP2002 提高组] 字串变换

时间:2023-06-06 21:23:27浏览次数:40  
标签:10 NOIP2002 变换 st que 字串 front

[NOIP2002 提高组] 字串变换

题目背景

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

题目描述

已知有两个字串 ,A,B 及一组字串变换的规则(至多 66 个规则),形如:

  • 1→1A1​→B1​。
  • 2→2A2​→B2​。

规则的含义为:在 A 中的子串 1A1​ 可以变换为 1B1​,2A2​ 可以变换为 2⋯B2​⋯。

例如:=abcdA=abcd,=xyzB=xyz,

变换规则为:

  • abc→xuabc→xu,ud→yud→y,y→yzy→yz。

则此时,A 可以经过一系列的变换变为 B,其变换的过程为:

  • abcd→xud→xy→xyzabcd→xud→xy→xyz。

共进行了 33 次变换,使得 A 变换为 B。

输入格式

第一行有两个字符串 ,A,B。

接下来若干行,每行有两个字符串 ,Ai​,Bi​,表示一条变换规则。

输出格式

若在 1010 步(包含 1010 步)以内能将 A 变换为 B,则输出最少的变换步数;否则输出 NO ANSWER!

输入输出样例

输入 #1
abcd xyz
abc xu
ud y
y yz
输出 #1
3

说明/提示

对于 100%100% 数据,保证所有字符串长度的上限为 2020。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e5+10;
 4 unordered_map<string,int>mp;//无向图去重
 5 string st,ed,s1[10],s2[10];
 6 int res,n;
 7 void bfs(string st)
 8 {
 9     queue<string>que;//双端队列,一个是字符串,一个是次数
10     queue<int>num;
11     que.push(st),num.push(0);
12     while(!que.empty())
13     {
14         string now=que.front(),tmp=que.front(),tmp1=que.front();
15         int nownum=num.front();
16         que.pop(),num.pop();
17         if(mp.count(now)) continue;//剪枝
18         if(nownum>10)
19         {
20             cout<<"NO ANSWER!";
21             return;
22         }
23         if(now==ed)
24         {
25             cout<<nownum;
26             return;
27         }
28         mp[now]=1;
29         for(int i=0;i<res;i++)
30         {
31             now=tmp1;
32             while(1)
33             {
34                 int x=now.find(s1[i]);//寻找队头字符串是否可以被替换
35                 if(x==-1) break;//不行的话就断
36                 tmp=tmp1;
37                 tmp.replace(x,s1[i].size(),s2[i]);//把队头字符串中所有含有s1字符串的全替换了
38         //某个String a.replace(pos,len,另一个String b) 替换a中pos开始往后len的这些字符为b
39                 que.push(tmp),num.push(nownum+1);
40                 now[x]='~';//要把它变成没用字符,不然后下次while循环还是会搜到,会爆
41             } 
42         }
43     }
44     cout<<"NO ANSWER!";
45     return;
46 }
47 int main()
48 {
49     cin>>st>>ed;
50     while(cin>>s1[res]>>s2[res]) res++;
51     bfs(st);
52     return 0;
53 }

 

标签:10,NOIP2002,变换,st,que,字串,front
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17461754.html

相关文章

  • 傅里叶变换推导
    定义\[F(\omega)=F(f(t))=\int_{}^{}f(t)*e^{-j\omegat}dt\]常用信号的傅里叶变换对\(F(A*cos(\omega_0t))=\piA[\delta(\omega-\omega_0)+\delta(\omega+\omega_0)]\)\(F(A*sin(\omega_0t))=-j\piA[\delta(\omega-\omega_0)-\delta(\omega+\omega_0)]\......
  • 相机的坐标系变换
    1.正文 图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图:   构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点。 接下来的......
  • Blender+kanzi 变换归原则和应用窗口的变换使用方法。
    1、选中物体,ctrl+a 弹出 应用窗口,选择应用旋转,它会把变换的窗口数值都归0.同理其他的也是一样。这个操作会把模型的轴心回归到blender画面的中心点儿。 如果不归0的话,导入到kanzi里面,模型就跟kanzi里的不一致。 2、移动物体到左上角,设置原点到几何中心。ctrl +a 全......
  • 小波变换
    1小波产生的背景与历史1.1“点”的概念一维中,“点”可以表示为“一个数\(x\)”;到了二维平面中,“点”可以表示为“一个数对\((x,y)\)”、或者考虑复平面时可以表示为\(x+\mathrm{i}y\)参考链接:小波理论及应用-哈工大-冉启文-Bilibili......
  • C语言--模拟实现atoi 字串转整型
    模拟实现atoi,仅考虑了部分转换规则intmy_atoi(constchar*p){ intflag=1; longlongn=0; //空指针 if(p==NULL) return0x000000; //空字符 if(*p=='\0') return0x000000; //跳过字串前空字符 while(!(*p=='+'||*p=='-'||(*p>='0......
  • [5月摸鱼计划] 浅谈DCDC电压变换(原理、结构、可用)
    DCDC转换器简介在电子产品中,我们常需要不同的直流电压来为电路提供工作,这时我们便会见到LDO和DC/DC的身影,但是严格意义上LDO也是一种DC/DC,在电源芯片选型中,LDO和DC/DC则是两种完全不同的芯片。与线性稳压器LDO相比较,效率高是DC/DC的显著优势,通常效率在70%以上,效率高的可达到95%以上......
  • lsh的三角函数变换题
    题面在蔡徐坤右肩带脱落时,形成两个角\(\alpha,\beta\),其中\(\alpha\in[\frac{\pi}{4},\pi]\),\(\beta\in[\pi,\frac{3\pi}{2}]\),且\(\sin2\alpha\)=\(\frac{\sqrt{5}}{5}\),\(\sin(\alpha-\beta)=\frac{\sqrt{10}}{10}\),问\(\alpha+\b......
  • NumPy_矩阵的八种运算以及变换矩阵
    概念numpy下的linalg=linear+algebra01.数学概念vector向量array:数组matrix:矩阵标量(数量)物理定义:只有大小,没有方向的量n个有次序的数a_{1},a_{2},····,a_{n}所组成的数组称为n维向量--行向量和列向量数组,是有序的元素序列m×n个数aij(i=1,2......
  • 仿射变换加密
    根据公式c=Ea,b(m) ☰a*m+b(mod26);如果已知a,b,加密非常简单,代码如下:#include<bits/stdc++.h>usingnamespacestd;inta,b;voidInput(){intp,val;charkey;charkey_2[1010];cout<<"请输入a,b的值(中间以空格分开)"<<endl;......
  • 不同Radix实现方式的快速傅里叶变换复杂度matlab仿真分析,对比基2,基4以及分裂基
    1.算法仿真效果matlab2022a仿真结果如下: 2.算法涉及理论知识概要       快速傅里叶变换(fastFouriertransform),即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计......