SPOJ PLD的答案错误
Getting a wrong answer for SPOJ PLD
我正试图解决SPOJ上的PLD问题,但我在第9个测试用例中得到了一个WA。
我的方法:
我正在实现Manacher算法,我相信如果有错误,那么这段代码可能是错误的。
if((k%2==0)&&(p[i]>=k)&&(temp[i]=='#'))
count++;
if((k%2==1)&&(p[i]>=k)&&(temp[i]!='#'))
count++;
但根据我的方法,如果字符是#
,那么以它为中心的回文字符串的最大长度只能是偶数,所以如果是p[i] >= k
,那么如果我们正在寻找偶数长度的回文串,我正在增加计数。
类似地,对于以第i个位置为中心的字符[考虑输入字符,即#以外的字符],但对于奇数长度的字符串。
#include<stdio.h>
#include<string.h>
char a[30002],temp[60010];
int p[60010];
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
int main()
{
//freopen("input.txt","r+",stdin);
//freopen("a.txt","w+",stdout);
int k,len,z;
scanf("%d",&k);
getchar();
gets(a);
len=strlen(a);
//Coverting String
temp[0]='$';
temp[1]='#';
z=2;
for(int i=1;i<=len;i++)
{
temp[z++]=a[i-1];
temp[z++]='#';
}
len=z;
int r=0,c=0,check=0,idash,t,count=0;
for(int i=1;i<len;i++)
{
check=0;
idash=c-(i-c);
p[i]=r>i?min(r-i,p[idash]):0;
t=p[i];
while(temp[i+p[i]+1]==temp[i-1-p[i]])
p[i]++;
if(r<i+p[i])
{
c=i;
r=i+p[i];
}
if((k%2==0)&&(p[i]>=k)&&(temp[i]=='#'))
count++;
if((k%2==1)&&(p[i]>=k)&&(temp[i]!='#'))
count++;
}
printf("%d",count);
//getchar();
//getchar();
return 0;
}
您可能希望利用C++短路对逻辑表达式的求值
例如,重新排列订单,以便首先检查"#":
if ((temp[i] == '#') && (k % 2 == 0) && (p[i] >= k))
在上面的重排中,如果字符不是"#",则不会对其他表达式求值。
您可能希望将(p[i] >= k)
提取到外部if
语句,因为它对两者都是通用的:
if (p[i] >= k)
{
if ((temp[i] == '#') && (k % 2 == 0)) ++count;
if ((temp[i] != '#') && (k % 2 == 1)) ++count;
}
上述修改将仅导致表达式CCD_ 5的一个评估。
还要检查for
循环,看看是否有语句或表达式没有更改或重复。如果一个语句或表达式在循环内没有改变,它被称为不变量,并且可以在循环之前或之后移动。
重复的语句或表达式(如数组索引计算)可以求值并存储在临时变量中。尽管好的编译器可以做到这一点(取决于优化级别),但在您的性能要求中,您可能需要帮助编译器。
另一个建议是用指向该位置的指针或对该位置的引用来替换p[i]
。同样,这是为了在优化设置不优化时帮助编译器:
int& p_slot_i = p[i]; // This syntax needs checking
// or
int * p_slot_i = &p[i];
//...
t = *p_slot_i;
while(temp[i + *p_slot_i + 1] == temp[i - 1 - *p_slot_i)
{
*p_slot_i++;
}
最后,消除空格、空行和大括号不会影响程序性能。一个程序是一行或在多行之间间隔,将具有精确的汇编翻译和精确的性能。因此,请添加空格、空行和大括号以提高可读性。
编辑1:min()的性能
您可能需要将min()
函数声明为inline
,以向编译器建议您希望将函数粘贴到调用它的位置,而不是调用该函数。函数调用会减慢程序的执行速度。
- 递归求和任务的错误答案
- 为什么我在代码厨师的 CMPRSS 问题中得到 WA(错误答案)?
- 请找出我的代码中的错误,它在提交得到错误答案的同时仍然适用于我的所有测试用例
- 寻找最小楼梯成本的动态规划问题的错误答案
- 为什么可变大小的数组会导致Codechef出现错误答案
- 如何修复此代码对几个测试用例的错误答案?
- 使用幂函数的计算给出了大数字的错误答案
- 快速排序算法,一些特定输入序列的错误答案和分段错误
- 二分法程序的错误答案(C++)
- 无法理解绘图程序中的错误答案
- C++ - 整数除以整数返回错误答案
- 布尔函数的错误答案
- SPOJ FASTFLOW上的错误答案
- 代码的错误答案是在Java Camel案件和C 下划线标识符之间转换的错误答案
- 200万以下所有素数的总和,线程给出错误答案
- 0-1整数背包返回错误答案(动态编程)
- UVa 在线判断 - 3n + 1 - 错误答案
- 提升C++原始算法错误答案
- 二项式系数函数C++错误答案 n>13
- 需要帮助以避免 SPOJ 上的"错误答案"