头像

封禁用户

无条件互粉




离线:10分钟前


最近来访(1837)
用户头像
CatBoomer
用户头像
我是cly
用户头像
热水袋
用户头像
IEE_
用户头像
limie
用户头像
xanxus1111
用户头像
kk19212
用户头像
雾台
用户头像
pcjj
用户头像
花生乱飞
用户头像
摸鱼小王子
用户头像
ViceCity
用户头像
万花筒写轮眼
用户头像
MiManchi_38
用户头像
siyufeng
用户头像
Leonard7
用户头像
您_5
用户头像
scboy
用户头像
Deadman
用户头像
absconded

新鲜事 原文

封禁用户
22小时前
我先睡了……好困……



封禁用户
22小时前



封禁用户
22小时前
#include <bits/stdc++.h>
using namespace std;
string s, t;
int m;
void COPY(int l, int r) { t = s.substr (l, r - l + 1); }
void CUT(int l, int r) {
    COPY(l, r);
    s.erase(l, r - l + 1);
}
void PASTE(int x) { s.insert(x + 1, t); }
int main() {
    cin >> s >> m;
    while (m--) {
        string opt; cin >> opt;
        if (opt == "COPY") {
            int l, r; cin >> l >> r;
            COPY(l, r);
        }
        if (opt == "CUT") {
            int l, r; cin >> l >> r;
            CUT(l, r);
        }
        if (opt == "PASTE") {
            int x; cin >> x;
            PASTE(x);
        }
        cout << s << endl;
    }
    return 0;
}



封禁用户
22小时前

初看还觉得操作有点多,一下子懵懵的。但是先不要急,我们来分析一下每一个操作。

Part 1 $COPY$

复制

方法一:暴力$for$循环

其实就是从字符串$s$中提取出一段区间$[l,r]$,存入字符串$t$里面。
那么,一个很简单而又很暴力的操作就是跑一遍$for$循环:

void COPY(int l, int r) {
    t = "";
    for (int i = l;i <= r; i++) t += s[i];
}

方法二:$STL$ $string$函数

在这里感谢C艹给了我们一个函数:substr,直接调用substr(起点, 长度)就可以返回字符串中的这个区间。
那么,代码就可以进一步优化了:

void COPY(int l, int r) { t = s.substr (l, r - l + 1); }

Part 2 $CUT$

剪切

剪切呢……其实从本质上看就是先$COPY$然后再执行区间删除。
那么$COPY$就和上面一样了,下面只讲删除

方法一:暴力for循环

用$for$截取区间前面的字符串和后面的字符串,拼接在一起就变成了删除后的字符串(也就是跳过中间的区间)。

string S = "";
for (int i = 0;i < l; i++) S += s[i];
for (int i = r + 1; i < s.size(); i++) S += s[i];
s = S;

方法二:利用$COPY$的操作

如果你看懂了上面$COPY$的第二种方法,相信这个你也一定看得懂。
利用substr来截取,其实和方法一也差不多。

s = s.substr(0, l) + s.substr(r + 1, s.size() - r - 1);

方法三:也是$STL$ $string$函数

继续感谢$STL$ $string$函数……
erase(起点,区间长度)这个确实很好用,一行代码就解决了。

s.erase(l, r - l + 1);

Part 3 $PASTE$

粘贴

方法一:暴力$for$循环

先把字符串$s$拆成前后两个部分,然后在中间插入t就完事了。

string S = "";
for (int i = 0;i <= x; i++) S += s[i];
S += t;
for (int i = x + 1;i < s.size(); i++) S += s[i];
s = S;

方法二:还是利用$COPY$的操作

还是一样……把字符串$s$拆成前后两个部分(只不过用的是substr函数)。

s = s.substr (0, x + 1) + t + s.substr (x + 1, s.size() - x - 1);

方法三:又双㕛叒叕是$STL$ $string$函数

继续感谢C艹……
insert(插入点, 要插入的字符串)这个也十分简洁……
那么最后就变成了:

s.insert(x + 1, t);

好啦,这次就到这里啦,有什么问题或建议请在评论区留言,谢谢!

现在献上完整代码:

#include <bits/stdc++.h>
using namespace std;
string s, t;
int m;
void COPY(int l, int r) { t = s.substr (l, r - l + 1); }
void CUT(int l, int r) {
    COPY(l, r);
    s.erase(l, r - l + 1);
}
void PASTE(int x) { s.insert(x + 1, t); }
int main() {
    cin >> s >> m;
    while (m--) {
        string opt; cin >> opt;
        if (opt == "COPY") {
            int l, r; cin >> l >> r;
            COPY(l, r);
        }
        if (opt == "CUT") {
            int l, r; cin >> l >> r;
            CUT(l, r);
        }
        if (opt == "PASTE") {
            int x; cin >> x;
            PASTE(x);
        }
        cout << s << endl;
    }
    return 0;
}



封禁用户
23小时前

转化为数字

#include <bits/stdc++.h>
using namespace std;

int sint(string s) {
    int a = 0, x = 1, i = 0;
    if (s[0] == '-') x = -1, i = 1;
    while (i < s.size()) {
        if (s[i] != ',') a = a * 10 + (s[i] - '0');
        i++;
    }
    return a * x;
}

int main() {
    string str1, str2;
    while (cin >> str1 >> str2) 
        cout << (sint(str1) + sint(str2)) << endl;
    return 0;
}


活动打卡代码 AcWing 3545. 寻找奇特的数

#include <bits/stdc++.h>
using namespace std;
int t, n, m;
int main() {
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &n, &m);
        int ans = 0;
        for (int i = 1;i * i <= m; i++) if (m % i == 0 && m / i <= n) ans += 2;
        if ((int)sqrt(m) * (int)sqrt(m) == m && sqrt(m) <= n) ans--;
        printf("%d\n", ans);
    }
    return 0;
}



从因数的角度来考虑,枚举$m$的每个因数。
每存在一对因数,也就是$a \times b = m$的时候,$ans$就要加上$2$,因为一个是第a行第b列,一个是第b行第a列。
但是还有一个特殊情况,例如$n = m = 36$的时候,$36$是一个完全平方数,这样$6 \times 6$就算了两次,所以要减去一个。

#include <bits/stdc++.h>
using namespace std;
int t, n, m;
int main() {
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &n, &m);
        int ans = 0;
        for (int i = 1;i * i <= m; i++) if (m % i == 0 && m / i <= n) ans += 2;
        if ((int)sqrt(m) * (int)sqrt(m) == m && sqrt(m) <= n) ans--;
        printf("%d\n", ans);
    }
    return 0;
}



这题呢就是一个模拟,没了……

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    scanf("%d", &n);
    while (n--) {
        string s; cin >> s;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '0') cout << s[i];
            else {
                int j = i + 1, cnt = 1;
                while (s[i] == s[j] && j < s.size()) {
                    j++; cnt++;
                    if (cnt == 5) { printf("11111"); i = j; break; }
                }
                if (cnt != 5) cout << s[i];
            }
        }
        cout << endl;
    }
    return 0;
}


新鲜事 原文

回头歌 语文老师一回头,此地空余黄鹤楼。 数学老师一回头,二次函数对称轴。 英语老师一回头,sorry加上三克油。 化学老师一回头,二氧化碳变汽油。 物理老师一回头,一根杠杆撬地球。 生物老师一回头,试管婴儿水里游。 地理老师一回头,大楼板块乱漂游。 历史老师一回头,秦始皇来推铅球。 体育老师一回头,仰卧起坐要抱头。 音乐老师一回头,八级地震炸地球。 美术老师一回头,蒙娜丽莎也风流。 全体老师一回头,学生永远没自由。


新鲜事 原文

(真实故事) (真实图片) 我要炸了 (我要裂开了……) 这测试点有点变态啊……
图片