一个关于STL容器的提示
查看原帖
一个关于STL容器的提示
242524
JRzyh楼主2022/8/31 19:35
#include<bits/stdc++.h>
using namespace std;
int n,p;string s;
int add(int pos)
{
	//cout<<pos<<endl; 
	if(pos<0)return -1;
	s[pos]++;
	if(s[pos]-'a'==p)
	{
		s[pos]='a';
		return add(pos-1);
	}
	else return 0;
}
int main()
{
	cin>>n>>p;
	cin>>s;

	while(1)
	{
		//cout<<s<<endl ;
		if(add(s.size()-1))
		{
			cout<<"NO";
			return 0; 
		}
		bool f=0;int pos=1<<30;
		for(int i=0;i<=s.size()-2;i++)
		{
			if(s[i]==s[i+1])
			{
				f=1;
				pos=min(pos,i+1);
				break;
			}
		}
		for(int i=0;i<=s.size()-3;i++)
		{
			if(s[i]==s[i+2])
			{
				f=1;
				pos=min(pos,i+2);
				break;
			}
		}
		if(!f)
		{
			cout<<s;return 0;
		}
		for(int i=pos+1;i<s.size();i++)s[i]='a'+p-1;
	
	}
	
	
    return 0;
}

这份代码看起来没有问题。

但它wa on 4

2 2
ab

原因在于:for(int i=0;i<=s.size()-3;i++)

在一般人的想法中长度为二的字符串肯定不存在长度为3的回文,所以这个循环不应被执行,看起来,0>2-3,所以的确不会执行。

事实上呢?

调试数据表明,他被执行了。

……?

锅出在 s.size()-3

全部STL容器的size函数都是 unsigned int 形,而他-3,编译器认为他还是 unsigned int 形。

然而,这组数据减出了 -1,在二进制中使用补码表示。

由于 unsigned int 不认识什么补码,所以就将他转换为了一个大整数(大概是int_max?)

于是就出锅了。

解决方法就是强制类型转换。


看起来好像很平常的锅,但我以前没出过,写个讨论提醒一下。

2022/8/31 19:35
加载中...