组合题
#include <iostream>#include <queue>using namespace std; const int maxl = 20000000; class Map {    struct item {        string key; int value;    } d[maxl];    int cnt;  public:    int find(string x) {        for (int i = 0; i < cnt; ++i)            if (d[i].key == x)                return d[i].value;        return -1;    }    static int end() { return -1; }    void insert(string k, int v) {        d[cnt].key = k; d[cnt++].value = v;    }} s[2]; class Queue {    string q[maxl];    int head, tail;  public:    void pop() { ++head; }    string front() { return q[head + 1]; }    bool empty() { return head == tail; }    void push(string x) { q[++tail] = x;  }} q[2]; string st0, st1;int m; string LtoR(string s, int L, int R) {    string t = s;    char tmp = t[L];    for (int i = L; i < R; ++i)        t[i] = t[i + 1];    t[R] = tmp;    return t;} string RtoL(string s, int L, int R) {    string t = s;    char tmp = t[R];    for (int i = R; i > L; --i)        t[i] = t[i - 1];    t[L] = tmp;    return t;} bool check(string st , int p, int step) {    if (s[p].find(st) != s[p].end())        return false;    ++step;    if (s[p ^ 1].find(st) == s[p].end()) {        s[p].insert(st, step);        q[p].push(st);        return false;    }    cout << s[p ^ 1].find(st) + step << endl;    return true;} int main() {    cin >> st0 >> st1;    int len = st0.length();    if (len != st1.length()) {        cout << -1 << endl;        return 0;    }    if (st0 == st1) {        cout << 0 << endl;        return 0;    }    cin >> m;    s[0].insert(st0, 0); s[1].insert(st1, 0);    q[0].push(st0); q[1].push(st1);    for (int p = 0;            !(q[0].empty() && q[1].empty());            p ^= 1) {        string st = q[p].front(); q[p].pop();        int step = s[p].find(st);        if ((p == 0 &&                (check(LtoR(st, m, len - 1), p, step) ||                 check(RtoL(st, 0, m), p, step)))                ||                (p == 1 &&                 (check(LtoR(st, 0, m), p, step) ||                  check(RtoL(st, m, len - 1), p, step))))            return 0;    }    cout << -1 << endl;    return 0;} 
第28题判断题原卷 1.5 分

输出可能为 00。( )

填写答案
第29题判断题原卷 1.5 分

若输入的两个字符串长度均为 101101 时,则 m=0m=0 时的输出与 m=100m=100 时的输出是一样的。( )

填写答案
第30题判断题原卷 1.5 分

若两个字符串的长度均为 nn,则最坏情况下,此程序的时间复杂度为 O(n!)O(n!)。( )

填写答案
第31题单选题原卷 2.5 分

(2.5 分)若输入的第一个字符串长度由 100100 个不同的字符构成,第二个字符串是第一个字符串的倒序,输入的 mm 为 00,则输出为( )。

填写答案
第32题单选题原卷 4 分

(4 分)己知当输入为 0123\n3210\n1 时输出为 44,当输入为 012345\n543210\n1 时输出为 1414,当输入为 01234567\n76543210\n1 时输出为 2828,则当输入为0123456789ab\nba9876543210\nl 输出为 ( )。其中 \n 为换行符。

填写答案
第33题单选题原卷 4 分

(4 分)若两个字符串的长度均为 nn,且 0<m<n−10<m<n-1,且两个字符串的构成相同(即任何一个字符在两个字符串中出现的次数均相同),则下列说法正确的是( )。提示:考虑输入与输出有多少对字符前后顺序不一样。

填写答案