求解,只有最后一个点AC,代码确实很啰嗦,我是菜鸡QAQ
查看原帖
求解,只有最后一个点AC,代码确实很啰嗦,我是菜鸡QAQ
242987
SDoubleC楼主2021/8/18 00:17
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define MAXLEN 255
typedef struct {
    char ch[MAXLEN];
    int length;
} SString;
//截取子串
bool SubString1(SString *S, int pos, int len) {
    SString Sub;
    if (pos + len > S->length)
        return false;
    for (int i = pos; i < pos + len; ++i) {
        Sub.ch[i - pos] = S->ch[i];
    }
    Sub.length = len;
    strcpy(S->ch, Sub.ch);
    S->length = len;
    return true;
}
//求子串
bool SubString(SString *sub, SString S, int pos, int len) {
    if (pos + len > S.length)
        return false;
    for (int i = pos; i < pos + len; ++i) {
        sub->ch[i - pos] = S.ch[i];
    }
    sub->length = len;
    return true;
}

//比较操作。若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0.
int StrCompare(SString S, SString T) {
    for (int i = 0; i < S.length && i < T.length; ++i) {
        if (S.ch[i] != T.ch[i])
            return S.ch[i] - T.ch[i];
    }
    //扫描过的所有字符都相同,则长度长的串更大
    return S.length - T.length;
}

//定位子串在主串中第一次出现的位置
int Index(SString S, SString T) {
    int i = 0, n, m;
    m = strlen(T.ch);
    n = strlen(S.ch);
    SString sub;//用于暂存子串
    while (i <= n - m + 1) {
        SubString(&sub, S, i, m);
        if (StrCompare(sub, T) != 0)
            ++i;
        else
            return i;//返回子串在主串中的位置
    }
    return -1;//S中不存在与T相等的子串
}

//增加串
void addString(SString *S, SString str) {
    int a = S->length, b = str.length;
    S->length = a + b;
    for (int i = a; i < a + b; ++i) {
        S->ch[i] = str.ch[i - a];
    }
}

//插入串
void insertString(SString *S, SString sub, int a) {
    SString s1;
    strcpy(s1.ch, S->ch);
    SubString1(&s1, a, strlen(s1.ch) - 1);
    S->length = S->length + sub.length;
    for (int i = a; i < a + sub.length; ++i) {
        S->ch[i] = sub.ch[i - a];
    }
    for (int i = a + sub.length; i < S->length; ++i) {
        S->ch[i] = s1.ch[i - a - sub.length];
    }
}

int main() {
    int n;
    scanf("%d", &n);
    SString S;
    scanf("%s", S.ch);
    S.length = strlen(S.ch);
    for (int i = 1; i <= n; ++i) {
        int m;
        scanf("%d", &m);
        if (m == 1) {
            SString str;
            scanf("%s", str.ch);
            str.length = strlen(str.ch);
            addString(&S, str);
            printf("%s\n", S.ch);
        } else if (m == 2) {
            int a, b;
            scanf("%d%d", &a, &b);
            SubString1(&S, a, b);
            printf("%s\n", S.ch);
        } else if (m == 3) {
            int a;
            scanf("%d", &a);
            SString sub;
            scanf("%s", sub.ch);
            sub.length = strlen(sub.ch);
            insertString(&S, sub, a);
            printf("%s\n", S.ch);
        } else if (m == 4) {
            SString sub;
            scanf("%s", sub.ch);
            sub.length = strlen(sub.ch);
            int a = Index(S, sub);
            printf("%d\n", a);
        }
    }
}
2021/8/18 00:17
加载中...