#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?)
于是就出锅了。
解决方法就是强制类型转换。
看起来好像很平常的锅,但我以前没出过,写个讨论提醒一下。