题解:B4048 [语言月赛 202410] 断章取义

· · 题解

前言

Update in 2024/11/17 \sim 2024/11/20

题目传送门。

这题似乎有坑,搞了半天!~可能对别的大佬来说很简单!~

思路

我们使用string提供的find函数直接搜索字符串中是否存在子串 \texttt{not},每次让计数器自增一。

你会获得 10 分。

题目中说,每一轮剪辑找到 S 中所有子串 \texttt{not},而我的代码中一次只找一次,所以会WA

S=\texttt{notnot}

我们每次遍历一遍 S,用substr判断是否有 \texttt{not},如果有就用erase删除 \texttt{not}

你会获得 70 分。

i 为循环变量,删除 \texttt{not} 之后就不应该i++了,否则就会少检测一次。

S=\texttt{notnot}

第一轮把 \texttt{not} 删掉,S=\texttt{not},当前 i0,每次循环都会i++,所以 i 变成 1 了,此时 S_i=\texttt{o},就检测不到下一个 \texttt{not} 了。

我们循环时不写i++,当 s_i,s_{i+1},s_{i+2} \ne \texttt{not} 时才i++

如果你是像我这样写的话,你就错了:

for(int i=0;i<s.size()-2;)

你会获得 90 分,有一个RE

s.size()的类型是size_tsize_t只能存无符号整数,故不能存负数,当 |s|<2 时,|s|-2<0,这样会溢出,并变成一个很大的整数,所以会越界。

我们将s.size()强制转整。

这样就 100 分了!

Code

while(s.find("not")!=string::npos){
    for(int i=0;i<(int)s.size()-2;){
        if(s.substr(i,3)=="not") s.erase(i,3);
        else i++;
    }
    c++;
}

总结

所以我们以后要养成好习惯,尽量把s.size()强制转整。