两个测试点只过了一个给的样例都过了,求大佬查找下逻辑漏洞
#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。 Request failed with status code 429
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:} 这段代码存在一些逻辑错误。主要问题在于求最长重复后缀和去除第二长相等前后缀的部分。
首先,求最长重复后缀的代码有问题。在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]