阅读程序(第一题):KMP 字符串匹配

ee517518 组合题 共 个子题

阅读下面程序,完成后面的判断题和单选题。判断题正确填 A,错误填 B。程序先读入模式串 P,再读入主串 T,两行均不含空格且只由小写字母组成,长度不超过 1000000。

#include <cstdio>
#include <cstring>

const int MAXN = 1000005;
char P[MAXN], T[MAXN];
int pi[MAXN];

int main() {
    scanf("%s", P);
    scanf("%s", T);
    int m = (int)strlen(P), n = (int)strlen(T);
    pi[0] = 0;
    for (int i = 1; i < m; ++i) {
        int j = pi[i - 1];
        while (j > 0 && P[i] != P[j]) j = pi[j - 1];
        if (P[i] == P[j]) ++j;
        pi[i] = j;
    }
    int cnt = 0, j = 0;
    for (int i = 0; i < n; ++i) {
        while (j > 0 && T[i] != P[j]) j = pi[j - 1];
        if (T[i] == P[j]) ++j;
        if (j == m) {
            ++cnt;
            j = pi[j - 1];
        }
    }
    printf("%d\n", cnt);
    printf("%d\n", pi[m - 1]);
    return 0;
}

子题 判断题

判断题:程序第一行输出的是模式串 P 在主串 T 中出现的次数(允许两次出现部分重叠)。( )

A

正确

B

错误

子题 判断题

判断题:当两行输入依次为 aabaa 与 aabaabaabaa 时,程序的输出为第一行 3、第二行 2。( )

A

正确

B

错误

子题 判断题

判断题:若把第 25 行的 `j = pi[j - 1];`(匹配成功之后执行的那一条)改为 `j = 0;`,其余不变,则当两行输入仍为 aabaa 与 aabaabaabaa 时,程序第一行的输出会变为 2。( )

A

正确

B

错误

子题 单选题

当两行输入依次为 abab 与 abababab 时,程序第一行的输出为( )。

A

2

B

3

C

4

D

5

子题 单选题

若主串长度为 n、模式串长度为 m,则该程序的时间复杂度为( )。

A

Θ(n + m)

B

Θ(nm)

C

Θ(n log m)

D

Θ(m²)

正在加载题目数据…
已答 /
子题
该题型需在试卷/作业中作答,单题练习暂不支持
答案解析
讨论
发布
登录后参与讨论 立即登录
发布讨论需先绑定并验证手机号 去绑定手机号
加载中…
我
我
回复 @
回复 @
发送
还没有人讨论,来发表第一条吧