申谭 发表于 2023-11-8 13:39:18

两个测试点只过了一个给的样例都过了,求大佬查找下逻辑漏洞

#include<stdio.h>
#include<string.h>
char S;
int next1;
int next2;
char TS;
int found_next()
{
    int i=0,j=-1,t=0;
    next1=-1;
    next2=-1;
    int m=strlen(S);
    for(i=m-1;i>=0;i--)
    {
      TS=S;
                t++;
    }
    int max=0 ,mid=0,tmax=0;
    i=0;
while(i<m)
    {
       if(j==-1||TS==TS)
       {
          next1[++i]=++j;
         if(next1>max) {max=next1;}
       }
      else j=next1;
    }
    i=0,j=-1;
while(i<m)
    {
       if(j==-1||S==S)
       {
          next2[++i]=++j;
         if(next2>tmax) {tmax=next2;}
       }
      else j=next2;
    }
    mid=next2;
    if(mid<0||m-2*mid<=0) mid=0;
    int X;
    X=max-mid*2+m;
    return X;
}
int main ()
{
    while(scanf("%s",S)!=EOF)
    {
   int n=0;
   n=found_next();
   printf("%d\n",n);
    }
return 0;
}
波比和哈丽在玩一个字母游戏,波比给出一个字符串S,要求哈丽按照一定规则,基于该字符串算出一个数字X。

规则是:

(1)求出S的最长重复后缀P(P是S的后缀且在S中出现大于1次,例如yacbacba的最长重复后缀是acba),

(2)求出在S中去除第二长相等前后缀(S中所有相等的前后缀中第2长者,例如abcabcxxxabcabc中最长相等前后缀是abcabc,第二长的相等前后缀则是abc)后剩下的子串Q(例如abcabcxxxabcabc去除第二长相等前后缀后,剩下abcxxxabc)。

则X=P的长度+Q的长度。

注意一个字符串不能称为自己的前缀或后缀。子串Q至少为空串,其长度大于等于0,不能为负数。

请编写程序帮助哈丽根据给定字符串S,根据上述规则计算出数字X。

Mike_python小 发表于 2023-11-8 13:40:44

Request failed with status code 429

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-11-8 13:40:56

这段代码存在一些逻辑错误。主要问题在于求最长重复后缀和去除第二长相等前后缀的部分。

首先,求最长重复后缀的代码有问题。在while循环中,应该是 while(i<m-1) 而不是 while(i<m) ,因为在求最长重复后缀的过程中,最后一个字符是没有意义的,不应该参与计算。此外,在计算 max 时,应该使用 max=next1[ i] 而不是 max=next1 。

其次,求去除第二长相等前后缀的代码也有问题。同样,在while循环中,应该是 while(i<m-1) 而不是 while(i<m) 。在计算 tmax 时,应该使用 tmax=next2[ i] 而不是 tmax=next2 。

最后,计算X的公式也有问题。应该是 X=max-mid+m 而不是 X=max-mid*2+m 。

下面是修改后的代码:

#include <stdio.h>
#include <string.h>

char S;
int next1;
int next2;
char TS;

int found_next() {
    int i = 0, j = -1, t = 0;
    next1 = -1;
    next2 = -1;
    int m = strlen(S);
    for (i = m - 1; i >= 0; i--) {
      TS = S[ i];
      t++;
    }
    int max = 0, mid = 0, tmax = 0;
    i = 0;
    while (i < m - 1) {
      if (j == -1 || TS[ i] == TS) {
            i++;
            j++;
            next1[ i] = j;
            if (next1[ i] > max) {
                max = next1[ i];
            }
      } else {
            j = next1;
      }
    }
    i = 0;
    j = -1;
    while (i < m - 1) {
      if (j == -1 || S[ i] == S) {
            i++;
            j++;
            next2[ i] = j;
            if (next2[ i] > tmax) {
                tmax = next2[ i];
            }
      } else {
            j = next2;
      }
    }
    mid = next2;
    if (mid < 0 || m - 2 * mid <= 0) {
      mid = 0;
    }
    int X = max - mid + m;
    return X;
}

int main() {
    while (scanf("%s", S) != EOF) {
      int n = 0;
      n = found_next();
      printf("%d\n", n);
    }
    return 0;
}


经过这些修改,代码应该能够正确计算出数字X了。
页: [1]
查看完整版本: 两个测试点只过了一个给的样例都过了,求大佬查找下逻辑漏洞