题库 信息学奥赛题库 题目列表 2019年CSP-S1提高组初赛阅读程序题:t是s的子序列的意...
组合题

2019年CSP-S1提高组初赛阅读程序题: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<slensuf[i] ≤suf[i+1].( )

A.
正确
B.
错误
第2题 判断

ts的子序列时,输出一定不为0.( ) 

A.
正确
B.
错误
第3题 判断

程序运行到第23行时,“j-i-1”一定不小于0.( ) 

A.
正确
B.
错误
第4题 判断

ts的子序列时,pre数组和suf数组满足:对任意0≤i<slenpre[i]>suf[i+1].( )

A.
正确
B.
错误
第5题 单选

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

A.

10

B.

12

C.

0

D.

1

第6题 单选

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

A.

0

B.

10

C.

12

D.

1

题目信息
阅读程序 初赛 2019年
-
正确率
0
评论
195
点击