Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取SPOJ PLD的错误答案_C++_Algorithm - Fatal编程技术网

C++ 获取SPOJ PLD的错误答案

C++ 获取SPOJ PLD的错误答案,c++,algorithm,C++,Algorithm,我正试图解决,但在第9个测试案例中我得到了一个WA 我的方法: 我正在实现Manacher的算法,我相信如果有什么错误,那么代码中可能有错误 if((k%2==0)&&(p[i]>=k)&&(temp[i]=='#')) count++; if((k%2==1)&&(p[i]>=k)&&(temp[i]!='#'))

我正试图解决,但在第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;
}
#包括
#包括
字符a[30002],温度[60010];
INTP[60010];
最小整数(整数a,整数b)
{

如果(a<p)你可能想利用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;
}
上述修改将只对表达式
(p[i]>=k)
进行一次计算

同时检查
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
,以向编译器建议您希望将函数粘贴到调用它的位置,而不是调用函数。函数调用会减慢程序的执行。

什么是“WA”?(请使用该信息更新您的问题,而不是用注释进行回复。)