1 条题解

  • 0
    @ 2025-8-24 21:07:27

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Jorisy
    之所以能够离去而义无反顾 / 仅因我记得你已厌倦的梦 / 连最后的道别都稀薄的风中 / 用加倍的叛逆做出抗争

    搬运于2025-08-24 21:07:26,当前版本为作者最后更新于2021-07-05 20:15:03,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    提供一种较为玄学做法。
    我们先不看这种做法,先来看一个 75pts75pts 的做法:

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
    	string s;
    	cin>>s;
    	cout<<(s.find("er",0)==s.size()-2||s.find("ly",0)==s.size()-2?s.substr(0,s.size()-2):(s.find("ing",0)==s.size()-3?s.substr(0,s.size()-3):s));
    	return 0;
    }
    

    这种方法是想按序找到后缀,然后删除,然而像输入 singing 时,其不是我们所希望的 sing,而是 singing。因为先找到的是 s 后的子串 ing
    既然正着不行,那就——倒着找!
    这里涉及到函数 reverse()size(),详见。但除此还涉及到 find()erase()


    对于 find() 函数的用法:这个函数共有两个参数,一个是查找子串,一个是开始查找位置,对于查找,其会返回首次查到到位置;若找不到,则会返回 string::npos。如在字符串 I Love Luogu. 中查找子串 Luogu,会返回 77
    对于 erase() 函数的用法:这个函数也有两个参数,一个是删除子串的起始位置,一个是删除子串的长度。如在字符串 I Don't Love Luogu. 中删除子串 Don't,则字符串变成 I Love Luogu.
    完整代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
    	string s;
    	cin>>s;
    	reverse(s.begin(),s.end());//第一次翻转
        //由于翻转了,所以子串也要翻转
    	if(s.find("re",0)==0||s.find("yl",0)==0) s.erase(0,2);//删除长度是二的
    	else if(s.find("gni",0)==0) s.erase(0,3);//删除长度是三的
    	reverse(s.begin(),s.end());//重新翻转回来
    	cout<<s;
    	return 0;
    }
    
    • 1

    信息

    ID
    6976
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者