欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > T497772 QDLOI-R2-T3 Define

T497772 QDLOI-R2-T3 Define

2025/7/23 1:21:44 来源:https://blog.csdn.net/lry421308/article/details/142732974  浏览:    关键词:T497772 QDLOI-R2-T3 Define

T497772 QDLOI-R2-T3 Define题解

这是一道经典(也许也并不是)的字符串题目。我之所以说它很经典是应为我多次在这上翻车。。。

思路:

1、读入时存储修改与目标的对应关系

2、使用查找函数find进行查找,直到全部更改完成后为止

3、一定注意:需按照题目给定的对应顺序进行更改操作

第一次(40分)

问题在于被更改的字符串与目标字符串的下标没有对上,所以给改后出现了空字符

第二次(80分)

这里我可以给大家看看我当时的代码:

#include<iostream>
#include<string>
using namespace std;
const int MAXN=1e4+10;
int n,m;
string change[MAXN],to[MAXN];
int main(){cin>>n>>m;for(int i=1;i<=n;i++){string a,b,c;cin>>a>>b>>c;if(a=="#define"){change[i]=b;to[i]=c;}else{change[i]=c;to[i]=b;}}for(int i=1;i<=m;i++){string s;cin>>s;for(int i=1;i<=n;i++){if(change[i].size()>s.size())continue;if(change[i].size()==s.size()&&change[i]!=s)continue;while(s.find(change[i])<=s.size()){int p=s.find(change[i]);for(int j=p;j<p+change[i].size();j++){s[j]=to[i][j-p];}}}cout<<s<<" ";}return 0;
} 

可以注意到“while(s.find(change[i])<=s.size())”
这里就是我犯下的错误

我写的是:只要还能找到就继续找。而忽略了一种可能,就是我的替换前字符串和替换后字符串一致。所以,当最后一个数据点出现这种情况后会一直找,最终TLE

第三次(AC)

修改完前两个问题后,我的代码终于AC了

#include<iostream>
#include<string>
using namespace std;
const int MAXN=1e4+10;
int n,m,k=1;
string change[MAXN],to[MAXN];
int main(){cin>>n>>m;for(int i=1;i<=n;i++){string a,b,c;cin>>a>>b>>c;if(b==c)continue;//如果更改字串与目标字串相同直接跳过if(a=="#define"){change[k]=b;to[k++]=c;}else{change[k]=c;to[k++]=b;}}k--;for(int i=1;i<=m;i++){string s;cin>>s;for(int i=1;i<=k;i++){if(change[i].size()>s.size())continue;if(change[i].size()==s.size()&&change[i]!=s)continue;while(s.find(change[i])<=s.size()){int p=s.find(change[i]);for(int j=p;j<p+change[i].size();j++){s[j]=to[i][j-p];//同步下标}}}cout<<s<<" ";}return 0;
} 

完结撒花!!!

总结:

这是一道简单的字符串问题,但是,在这题中体现了细节的重要性,还是很有价值的。(希望大家不要像我一样翻车)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词