我正在努力解決problem PLD on SPOJ,但我在第九個測試案例中獲得了WA。SPOJ PLD [錯誤的答案]
我的方法:
我正在實施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;
}
什麼是「WA」? (請用這些信息更新您的問題,而不是回覆評論。) –