PTA20+字符串

1、古风排版

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
【输入样例】
4
This is a test case
【输出样例】
在这里插入图片描述

思路:初始化string组,for循环列每次将当前字符加入即可。

int main(){
   int n;
   string in;
   cin>>n;
   cin.ignore();
   getline(cin,in);

   int len = in.size(),t,c=0;
   string out[n]={""};
   //计算矩阵列数
   if (len%n) t = len/n+1;
   else t = len/n;
   
   //倒着存
   for (int i=t-1;i>-1;i--){
       for (int j=0;j<n;j++){
           if (c<len) out[j]=in[c++]+out[j];
           else out[j]=" "+out[j];
       }
   }
   for (int i=0;i<n;i++) cout<<out[i]<<endl;
   return 0;
}

2、敲笨钟

【输入格式】
在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。
【输出格式】
对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。
【输入样例】
5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.
【输出样例】
xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped

思路:寻找逗号,先看上句够3个字符吗(不够不用切割了否则越界)。以此切割上下句判断句末是否为"ong",若是则输出上半句,下半句用stringstream以空格为界切割,替换最后三个字为qiao ben zhong.

#include <iostream>
#include <sstream>
#include <cstring>
using namespace std;
int main(){
    int n,gap;
    cin>>n;
    cin.ignore();
    string in,left,right;
    while (n--){
        getline(cin,in);
        gap = in.find(',');
        //分成上下句
        if (gap<3) cout<<"Skipped"<<endl; //上半句太短
        else{
            left = in.substr(gap-3,3);
            right = in.substr(in.size()-4,3);
            if (left!="ong" || right!="ong") cout<<"Skipped"<<endl;//不押韵
            else{
                left = in.substr(0,gap+2); //先输出左半句
                cout<<left;
                //右半句分成单词后换末尾仨字
                right = in.substr(gap+2,in.size()-gap-1);
                stringstream sss(right);
                string word[3];
                int cnt=0;
                while (sss>>in){
                    if(cnt>2) cout<<word[cnt%3]<<" "; //非最后三个字符
                    word[cnt%3] = in;
                    cnt++;
                };
                cout<<"qiao ben zhong.\n";
            }
        }

    }
    return 0;
}

3、最长对称子串

【输入样例】
Is PAT&TAP symmetric?
【输出样例】
11

思路:将每一位看作中心/中心的一半,分别按奇数对称串和偶数对称串的规则进行左右扩展,比较得出以其为中心的长度,遍历求得最长长度。

string in;
int duichen(int x,int y){ //左右扩展求对应子串
    int cnt=0;
    if (x==y){
        cnt=1,x-=1,y+=1;
    }
    while (x>=0 && y<in.size()){
        if (in[x--]==in[y++]) cnt+=2;
        else break;
    }
    return cnt;
}
int main(){
    getline(cin,in);
    int t,maxi=0;
    //奇数个偶数个对称串一起求
    for (int i=0;i<in.size();i++){
        t=max(duichen(i,i),duichen(i-1,i));
        if (t>maxi) maxi=t;
    }
    cout<<maxi;
    return 0;
}

4、还原文件:字符串匹配

在这里插入图片描述
【输入格式】
输入首先在第一行中给出一个正整数 N(1<N≤10^5 ),为没有切碎的半张纸上断口折线角点的个数;随后一行给出从左到右 N 个折线角点的高度值(均为不超过 100 的非负整数)。随后一行给出一个正整数 M(≤100),为碎纸机里的纸条数量。接下去有 M 行,其中第 i 行给出编号为 i(1≤i≤M)的纸条的断口信息,格式为:
K h[1] h[2] … h[K]
其中 K 是断口折线角点的个数(不超过10 ^4+1),后面是从左到右 K 个折线角点的高度值。为简单起见,这个“高度”跟没有切碎的半张纸上断口折线角点的高度是一致的。
【输出格式】
在一行中输出还原后纸条的正确拼接顺序。纸条编号间以一个空格分隔,行首尾不得有多余空格。
题目数据保证存在唯一解。
【输入样例】
17
95 70 80 97 97 68 58 58 80 72 88 81 81 68 68 60 80
6
4 68 58 58 80
3 81 68 68
3 95 70 80
3 68 60 80
5 80 72 88 81 81
4 80 97 97 68
【输出样例】
3 6 1 5 2 4

未碎纸片和碎纸可当string存储并进行匹配。有一个测试点为是有纸片是另一纸片前缀,则需要将所有可能的纸片当作首个进行模拟,看哪种情况可唯一拼成。

#include <vector>
#define M 100001
int n,m,x;
int visit[M];
string in;//未碎纸
string v[101];//碎纸
vector<int> res;
bool dfs(int now){
    int f=in.rfind(" ");//最后一个空格
    if (now==f+1) return true;
    for (int i=0;i<n;i++){
        if (!visit[i]&&in[now]==v[i][0]){
            string s=in.substr(now,v[i].size());
            if (s==v[i]){//可匹配
                visit[i]=1;
                res.push_back(i+1);
                int f=v[i].rfind(" ");//最后一个空格
                if (dfs(now+f+1)) return true;//成功匹配
                res.pop_back();
                visit[i]=0;
            }
        }
    }
    return false;//没有匹配成功
}
int main(){
    //输入
    cin>>n;
    cin.ignore();
    getline(cin,in);
    cin>>m;
    cin.ignore();
    for (int i=0;i<m;i++){
        getline(cin,v[i]);
        int f=v[i].find(" ");//第一个空格
        v[i]=v[i].substr(f+1,v[i].size()-f-1);//只要纸片信息
    }
    for (int i=0;i<n;i++) visit[i]=0;
    //模拟循环,每个符合的纸条都当头试试
    for (int i=0;i<n;i++){
        string s=in.substr(0,v[i].size());
        if (s==v[i]){//可匹配
            visit[i]=1;
            res.push_back(i+1);
            int f=v[i].rfind(" ");//最后一个空格
            if (dfs(f+1)) break;//成功匹配
            res.pop_back();
            visit[i]=0;
        }
    }
    //输出
    for (int i=0;i<res.size()-1;i++) cout<<res[i]<<" ";
    cout<<res[res.size()-1];
    return 0;
}

5、估值一亿的AI核心代码

在这里插入图片描述
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

无论用户说什么,首先把对方说的话在一行中原样打印出来;
消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
把原文中所有大写英文字母变成小写,除了 I;
把原文中所有独立的 can you、could you 对应地换成 I can、I could—— 这里“独立”是指被空格或标点符号分隔开的单词;
把原文中所有独立的 I 和 me 换成 you;
把原文中所有的问号 ? 换成惊叹号 !;
在一行中输出替换后的句子作为 AI 的回答。
【输入格式】
输入首先在第一行给出不超过 10 的正整数 N,随后 N 行,每行给出一句不超过 1000 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。
【输出格式】
按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。
【输入样例】
6
Hello ?
Good to chat with you
can you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know
【输出样例】
Hello ?
AI: hello!
Good to chat with you
AI: good to chat with you
can you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don’t know

字符串无敌细节题,满分不要想了,能骗多少分是多少分

摘抄大佬的码,又简洁又好看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
7-8 敲笨钟 (15分) 微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。 现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。 输入格式: 输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。 输出格式: 对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。 输入样例: 5 xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong. tian sheng wo cai bi you yong, qian jin san jin huan fu lai. xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long. zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong. ren xian gui hua luo, ye jing chun shan kong. 输出样例: xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong. Skipped xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong. Skipped Skipped

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值