所以,我正在解决以下问题:
http://codeforces.com/problemset/problem/276/B
现在,我想到的逻辑如下:
继续执行步骤1-6,直到我们遇到特定的break语句。
其中remove函数如下:
string rm (string s)
{
int len = s.length();
int l=0,r=len-1;
while (l < r)
{
if (s[l] != s[r])
{
s.erase(l,1);
//l++;
//r--;
break;
}
l++;
r--;
}
return s;
}
基本上,它会从结尾查找字符串中的第一个不匹配项,并删除该字符。 (因为两位球员都发挥得最好)
现在,我在其中一个测试用例中获得了一个WA,其中字符串很长(这么长,以至于我不能在这里写)。我阅读了社论,那里的逻辑与我的不同,我理解这一点。但是,我只是想知道我的逻辑中是否有任何错误。我的代码可能有一些错误,但我只是想知道我的逻辑是对还是错。
答案 0 :(得分:1)
注意玩家可以重新排序字母,因此
abcdcdba
已经是胜利的情况(重新订购 - &gt; abcddcba
)。
答案 1 :(得分:0)
您的算法不会检测到由1个字符组成的最短回文。
答案 2 :(得分:0)
如果字符串中出现奇数个字母的奇数,则第一个玩家获胜。否则,第二位选手获胜。
string whichPlayerWins(string s) {
int len = s.length();
int counts[26] = { [0 ... 25 ] = 0 };
int i;
for (i = 0; i < len; i++)
counts[s[i] - 'a']++;
int numOdd = 0;
for (i = 0; i < 26; i++) {
if (counts[i] % 2 == 1) numOdd++;
}
if (numOdd % 2 == 1) return "First";
else return "Second";
}