鱼C论坛

 找回密码
 立即注册
查看: 904|回复: 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 。

下面是修改后的代码:
#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 - 1) {
        if (j == -1 || TS[ i] == TS[j]) {
            i++;
            j++;
            next1[ i] = j;
            if (next1[ i] > max) {
                max = next1[ i];
            }
        } else {
            j = next1[j];
        }
    }
    i = 0;
    j = -1;
    while (i < m - 1) {
        if (j == -1 || S[ i] == S[j]) {
            i++;
            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 = 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了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 18:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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