为什么RE(样例已过)

P1308 [NOIP2011 普及组] 统计单词数

@[xiaoxiaoxia](/user/677127) 帮您调了一下,得分[$\color{YELLOW}70$](https://www.luogu.com.cn/record/85064766)分。有$7\color{GREEN}AC$,但会有$3\color{BLACK}TLE$. ``` #include<bits/stdc++.h> using namespace std; char a[15]; char b[1000005]; int main() { fgets(a,sizeof(a),stdin); fgets(b,sizeof(b),stdin); for(int i=0;a[i]!=10,i<strlen(a);i++) { if(a[i]>='A'&&a[i]<='Z') { a[i]+=32; } } for(int i=0;b[i]!=10,i<strlen(b);i++) { if(b[i]>='A'&&b[i]<='Z') { b[i]+=32; } } int flag=-1; int sum=0; for(int i=0;b[i]!=10,i<strlen(b);i++) { if(i==0||b[i-1]==' ') { int j; for(j=0;a[j]!=10,j<strlen(a);j++) { if(a[j]!=b[i+j]) { break; } } if(a[j]==10&&(b[i+j]==' '||b[i+j]==10)) { sum++; if(sum==1) { flag=i; } } } } if(sum==0) { cout<<-1; } else { cout<<sum<<" "<<flag<<endl; } return 0; } ``` 错误原因待会说,不过您这种做法太耗时了。最坏情况下要运行$10^{12}$次,建议换种思路重新做题。
by coldy_rainy @ 2022-08-25 13:29:05


@[xiaoxiaoxia](/user/677127) **【错误原因】:** $\color{PURPLE}RE$的原因是因为**数组越界**: 举个例子: --- `for(int i=0;a[i]!=10;i++)` 在这串代码中,当$i$一直枚举,到$a$字符数组边缘(即`i>strlen(a)`)时。因为`a[strlen(a)+1]`为**空**。所以该循环**迟迟没有退出**(这里的`a`**无空格**)。于是就一直这么循环下去,直到`i>15`($15$为`a`字符数组的**最大长度**)。一超出来,**字符数组越界**,于是很不幸的,$\color{PURPLE}RE$了。 --- 所以,在每个循环条件中,像我那么搞,都应该加上是否大于字符串长度的判断,以防超范围$\color{PURPLE}RE$掉。 出于$\bold{TLE}$的部分,请您换种思路实现本题。 最后,祝您在$\bold{OI}$路中进步。 谢谢您的观看。
by coldy_rainy @ 2022-08-25 13:39:01


多谢
by xiaoxiaoxia @ 2022-08-25 13:51:02


@[coldy_rainy](/user/526755) 找了好多终于知道re的原因了,太感谢了,大佬(膜拜)
by yyyyyyy777 @ 2023-11-08 01:12:10


|