题库 信息学奥赛题库 题目列表 t 是 s 的子序列的意思是:从 s 中删去若干个字符,可...
组合题

t 是 s 的子序列的意思是:从 s 中删去若干个字符,可以得到 

t;特别的,如果 s=t,那么 t 也是 s 的子序列;空串是任何串的子序列。

例如:acd 是 abcde 的子序列,acd 是 acd 的子序列,但 adc 不是 abcde 的子序列。

s[x..y] 表示 s[x]⋯s[y] 共 y−x+l 个字符构成的字符串,若 x>y 则 s[x..y] 是空串。t[x..y] 同理。

#include <iostream>

#include <string>

using namespace std;

const int max1 = 202;

string s, t;

int pre[max1], suf[max1];


int main() {

    cin >> s >> t;

    int slen = s.length(), tlen = t.length();


    for (int i = 0, j = 0; i < slen; ++i) {

        if (j < tlen && s[i] == t[j]) ++j;

        pre[i] = j; // t[0..j-1] 是 s[0..i] 的子序列

    }


    for (int  i = slen - 1 , j = tlen - 1; i >= 0; --i) {

        if(j >= 0 && s[i] == t [j]) --j;

        suf[i]= j; // t[j+1..tlen-1] 是 s[i..slen-1] 的子序列

    }


    suf[slen] = tlen -1;

    int ans = 0;

    for (int i = 0, j = 0, tmp = 0; i <= slen; ++i){

        while(j <= slen && tmp >= suf[j] + 1) ++j;

        ans = max(ans, j - i - 1);

        tmp = pre[i];

    }

    cout << ans << endl;

    return 0;

}

提示:

t[0…pre[i]−1] 是 s[0…i] 的子序列;

t[suf[i]+1…tlen−1] 是 s[i…slen−1] 的子序列。

判断题

(1分)程序输出时,suf 数组满足:对任意 0≤i<slen,suf[i]≤suf[i+1]。 ()

(2分)当 t 是 s 的子序列时,输出一定不为 0。()

(2分)程序运行到第 23 行时,j−i−1 一定不小于 0。()

(2分)当 t 是 s 的子序列时,pre 数组和 suf 数组满足:对任意 

0≤i<slen,pre[i]>suf[i+1]+1。 ()

选择题

若 tlen=10,输出为 0,则 slen 最小为()。

若 tlen=10,输出为 2,则 slen 最小为()。

第1题 判断
A.
正确
B.
错误
第2题 判断
A.
正确
B.
错误
第3题 判断
A.
正确
B.
错误
第4题 判断
A.
正确
B.
错误
第5题 单选
A.

10

B.

12

C.

0

D.

1

第6题 单选
A.

0

B.

10

C.

12

D.

1

题目信息
2019年 初赛
-
正确率
0
评论
62
点击