简单的字符串操作【SCPC 1082】【string的深刻认知+模拟】

题目链接


Description

众所周知,字符串是不会在区域赛之类的比赛中出现的

但是为了锻炼大家处理字符串的能力

让大家多一个没有用处的能力(bushi


给定n个字符串(从1开始编号),每个字符串中的字符位置从0开始编号,1≤length≤500,现有一下几种操作:

copy N X L :取出第N个字符串中以下标为X的字符开始的长度为L的字符串

add S1 S2:判断S1,S2是否均为0-99999之间的整数,若是则将其转化为整数做加法,否则做字符串加法(即"10"+"1"="101"),返回的值为一个字符串

find S N:在第N个字符串中从左到右寻找字符串S,若找到,返回其第一次出现的位置,否则返回字符串的长度

rfind S N:在第N个字符串中从右到左寻找字符串S,若找到,返回其第一次出现的位置,否则返回字符串的长度

insert S N X:在第N个字符串的第X个位置后插入字符串S

reset S N:将第N个字符串变为S

print N:打印输出第N个字符串

printall:打印输出所有字符串

over:结束操作

Tips:其中N,X,L可由find和rfind操作表达式构成,S,S1,S2可由copy和add操作表达式构成

Input

第一行为一个整数n(1≤n≤20)

接下来n行为n个字符串,字符串中不包含空格及操作命令

接下来若干行为一系列操作,直到over结束

Output

根据操作输出对应字符串


这道题很好的反馈了我们对于字符串string的操作的认知还有很大的不足。

介绍几个基本的string的基本操作

substr(开始下标,结束下标)

  提取串的某个子串。返回string类型。

find(字符串)

  在串中找第一个出现该字符串的下标位置。返回整型。

rfind(字符串)

  与find相同,只是找到最后一个出现的该字符串的下标位置。返回整型。

string::npos

  当在字符串中查找(返回类型为整型时),但是没有找到时候的情况。

erase(开始下标,结束下标)

  删除串中的某一段。

atoi( char * 类型 )

  将字符串(char)类型转换为整型。

c_str()

  将string类型转换为char *类型。

to_string(整型)

  将整型转化为string类型。

insert(位置(int), 字符串(string) )

  在该位置插入一个字符串,字符串位置为该位置。


  然后的话,这道题就有点像正则表达式的做法了,我们可以维护一个栈来实现这样的基本操作,最好别使用递归来做,因为递归不好判断它的意图,不如直接从后往前塞。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
stack<string> st;
string s[25];
int N;
bool Is_Num(string ch)
{
    int len = (int)ch.size();
    if(len > 5) return false;
    for(int i=0; i<len; i++) if(ch[i] < '0' || ch[i] > '9') return false;
    return true;
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    cin >> N;
    for(int i=1; i<=N; i++) cin >> s[i];
    string op, SS;
    while(getline(cin, op) && op != "over")
    {
        while(true)
        {
            if(op.empty()) break;
            int beg = (int)op.rfind(" ");
            if(beg == string::npos)
            {
                SS = op;
                op.clear();
            }
            else
            {
                SS = op.substr(beg + 1, op.size() - 1);
                op.erase(beg, op.size() - 1);
            }
            if(SS.empty()) continue;
            if(SS == "copy")
            {
                int n = atoi(st.top().c_str()); st.pop();
                int x = atoi(st.top().c_str()); st.pop();
                int l = atoi(st.top().c_str()); st.pop();
                string ans = s[n].substr(x, l);
                st.push(ans);
            }
            else if(SS == "add")
            {
                string S1 = st.top(); st.pop();
                string S2 = st.top(); st.pop();
                if(Is_Num(S1) && Is_Num(S2)) st.push(to_string(atoi(S1.c_str()) + atoi(S2.c_str())));
                else st.push(S1 + S2);
            }
            else if(SS == "find")
            {
                string S = st.top(); st.pop();
                int n = atoi(st.top().c_str()); st.pop();
                int ans = (int)s[n].find(S);
                if(ans == string::npos) ans = (int)s[n].size();
                st.push(to_string(ans));
            }
            else if(SS == "rfind")
            {
                string S = st.top(); st.pop();
                int n = atoi(st.top().c_str()); st.pop();
                int ans = (int)s[n].rfind(S);
                if(ans == string::npos) ans = (int)s[n].size();
                st.push(to_string(ans));
            }
            else if(SS == "insert")
            {
                string S = st.top(); st.pop();
                int n = atoi(st.top().c_str()); st.pop();
                int x = atoi(st.top().c_str()); st.pop();
                s[n].insert(x, S);
            }
            else if(SS == "reset")
            {
                string S = st.top(); st.pop();
                int n = atoi(st.top().c_str()); st.pop();
                s[n] = S;
            }
            else if(SS == "print")
            {
                int n = atoi(st.top().c_str()); st.pop();
                cout << s[n] << endl;
            }
            else if(SS == "printall")
            {
                for(int i=1; i<=N; i++) cout << s[i] << endl;
            }
            else st.push(SS);
            if(st.empty()) break;
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wuliwuliii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值