鱼C论坛

 找回密码
 立即注册
查看: 417|回复: 2

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

[复制链接]
发表于 2023-11-8 13:39:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
char S[100001];
int next1[100001];
int next2[100001];
char TS[100001];
int found_next()
{
    int i=0,j=-1,t=0;
    next1[0]=-1;
    next2[0]=-1;
    int m=strlen(S);
    for(i=m-1;i>=0;i--)
    {
      TS[t]=S[i];
                t++;
    }
    int max=0 ,mid=0,tmax=0;
    i=0;
while(i<m)
    {
       if(j==-1||TS[i]==TS[j])
       {
          next1[++i]=++j;
           if(next1[i]>max) {max=next1[i];}
       }
      else j=next1[j];
    }
    i=0,j=-1;
while(i<m)
    {
       if(j==-1||S[i]==S[j])
       {
          next2[++i]=++j;
           if(next2[i]>tmax) {tmax=next2[i];}
       }
      else j=next2[j];
    }
    mid=next2[tmax];
    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。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-8 13:40:44 | 显示全部楼层

回帖奖励 +5 鱼币

Request failed with status code 429

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2023-11-8 13:40:56 | 显示全部楼层
这段代码存在一些逻辑错误。主要问题在于求最长重复后缀和去除第二长相等前后缀的部分。

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

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

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

下面是修改后的代码:

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

  3. char S[100001];
  4. int next1[100001];
  5. int next2[100001];
  6. char TS[100001];

  7. int found_next() {
  8.     int i = 0, j = -1, t = 0;
  9.     next1[0] = -1;
  10.     next2[0] = -1;
  11.     int m = strlen(S);
  12.     for (i = m - 1; i >= 0; i--) {
  13.         TS[t] = S[ i];
  14.         t++;
  15.     }
  16.     int max = 0, mid = 0, tmax = 0;
  17.     i = 0;
  18.     while (i < m - 1) {
  19.         if (j == -1 || TS[ i] == TS[j]) {
  20.             i++;
  21.             j++;
  22.             next1[ i] = j;
  23.             if (next1[ i] > max) {
  24.                 max = next1[ i];
  25.             }
  26.         } else {
  27.             j = next1[j];
  28.         }
  29.     }
  30.     i = 0;
  31.     j = -1;
  32.     while (i < m - 1) {
  33.         if (j == -1 || S[ i] == S[j]) {
  34.             i++;
  35.             j++;
  36.             next2[ i] = j;
  37.             if (next2[ i] > tmax) {
  38.                 tmax = next2[ i];
  39.             }
  40.         } else {
  41.             j = next2[j];
  42.         }
  43.     }
  44.     mid = next2[tmax];
  45.     if (mid < 0 || m - 2 * mid <= 0) {
  46.         mid = 0;
  47.     }
  48.     int X = max - mid + m;
  49.     return X;
  50. }

  51. int main() {
  52.     while (scanf("%s", S) != EOF) {
  53.         int n = 0;
  54.         n = found_next();
  55.         printf("%d\n", n);
  56.     }
  57.     return 0;
  58. }
复制代码


经过这些修改,代码应该能够正确计算出数字X了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 10:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表