由于之前蓝桥杯省三被打击发了个动态:没想到得到了很多小伙伴的鼓励,也很荣幸得到了很多小伙伴的关注。
但是由于忙着写作业,完成实验室项目任务,但是我也在很尽量的抽时间刷题,这不干的了两点,想着大家都在鼓励我,我也不能辜负大家,所以决定把我自己的备战思路和刷题中遇到的知识点以及经验分享给大家,也算是给自己的刷题之路来一个记录吧,希望可以和大家一起学习成长!。
先说我备战的想法:
说到这里,我们就有了明确目标。有了目标,就有了动力,我们开始刷题,所以我准备先刷往年的ccf-csp的大模拟题,也就是第3题。
我今天刷的题是:2015-9月:模板生成系统
大家可以点击链接前往:
由于题过于长以及图片较多,我就不再为大家赘述。
由于之前大一都习惯用数组,所以对STL容器也并不是特别了解,但是我觉得会用STL容器是非常有必要的,因为这次蓝桥杯考试我就因为数组开小的本来应该开10000,不知道为什么当时只开了100,导致肯定会丢分,所以我决定带大家一起来了解下这题会用到的STL容器以及他们最常见的用法
1.vector
vector是变长数组,支持随机访问,不支持在任意位置O(1)插入。为了保证效率,元素的增删一般应该在末尾进行。
声明
#include 头文件
vector a; 相当于一个长度动态变化的int数组
vector b[233]; 相当于第一维长233,第二位长度动态变化的int数组
struct rec{…};
vector c; 自定义的结构体类型也可以保存在vector中
size与empty函数
size函数返回vector的实际长度(包含的元素个数),empty函数返回一个bool类型,表明vector是否为空。二者的时间复杂度都是O(1)。
所有的STL容器都支持这两个方法,含义也相同,之后我们就不再重复给出。
clear
clear函数把vector清空。
上图是上述三个函数的用法
push_back() 和 pop_back()
a.push_back(x) 把元素x插入到vector a的尾部。
b.pop_back() 删除vector a的最后一个元素。
2.map(虽然我们题目中用的是unordered_map,但是区别不大的
map容器是一个键值对key-value的映射,其内部实现是一棵以key为关键码的红黑树。Map的key和value可以是任意类型,其中key必须定义小于号运算符。
声明
map name;
例如:
map vis;
map hash;
map, vector> test;
find
h.find(x) 在变量名为h的map中查找key为x的二元组。
[]操作符
h[key] 返回key映射的value的引用,时间复杂度为O(logn)。
[]操作符是map最吸引人的地方。我们可以很方便地通过h[key]来得到key对应的value,还可以对h[key]进行赋值操作,改变key对应的value。
本题还用到了getchar()方法,这个方法的作用是将从缓冲区读一个字符,返回值是该字符的ascii码。除了用在读一个字符的时候,还主要用来取走上一次输入的回车,保障接下来的字符输入.
讲完最简单的用法,就来讲讲我是如何来模拟这个题的,我们边看代码边说:
#include
#include
#include
#include
#include
using namespace std;
int n,m;
unordered_map<string,string>vars;
vector<string>sm;
int main()
{
cin>>n>>m;//读入n,m;
getchar();//处理输入n,m的换行
while(n--)
{
string s;
getline(cin,s);//由于语句有空格,所以需要用getline读入,并且在头string.h里
sm.push_back(s);
}
while(m--)
{
string key="",value="";
char c;
cin>>key;
while(c=getchar() , c!='\"');//这里就是用于读入字符
while(c=getchar() , c!='\"') value+=c;
vars[key]=value;
}
for(auto& s:sm)
{
for(int i=0; i < s.size(); i++)
{
if(i+1<s.size() && s[i] == '{' && s[i+1]=='{')//大家要注意一定要把i+1的判断写在前面,不然直接在s[i+1]就越界了,后面判断了也没有用
{
string ans;
int j=i+3;//i+3是因为3分别是字符{,{,空格
while(s[j]!=' ')
{
ans+=s[j++];
}
cout<<vars[ans];
i=j+3;//和前面的3相反,空格,{,{
}
cout<<s[i];
}
cout<<endl;
}
return 0;
}
就在我以为完事之际代码在ACwing上一交,只过了一个点:
啊这,debug了会,又改成了下面的代码:
#include
#include
#include
#include
#include
using namespace std;
int n,m;
unordered_map<string,string>vars;
vector<string>sm;
int main()
{
cin>>n>>m;//读入n,m;
getchar();//处理输入n,m的换行
while(n--)
{
string s;
getline(cin,s);//由于语句有空格,所以需要用getline读入
sm.push_back(s);
}
while(m--)
{
string key="",value="";
char c;
cin>>key;
while(c=getchar() , c!='\"');
while(c=getchar() , c!='\"') value+=c;
vars[key]=value;
}
for(auto& s:sm)
{
for(int i=0; i < s.size(); i++)
{
if(i+1<s.size() && s[i] == '{' && s[i+1]=='{')
{
string ans;
int j=i+3;
while(s[j]!=' '|| s[j + 1] != '}' || s[j + 2] != '}')
{
ans+=s[j++];
}
cout<<vars[ans];
i=j+3;
}
if(i<s.size())//修改的地方
cout<<s[i];
}
cout<<endl;
}
return 0;
}
再交,过了两个点…
好家伙,我对比了下y总的代码,发现差别并不大,我决定去官网交,两个版本的代码都是80%,还得一说凌晨两点的评测姬速度就是快
好家伙,这y总数据就是牛,我寻思既然ACwing和官网加起来100,我就勉强放过自己吧!hhh
5.7日更新内容:
在刷另一题的时候发现了这题的bug,bug在那里请大家看下面代码:
#include
#include
#include
#include
#include
using namespace std;
int n,m;
unordered_map<string,string>vars;
vector<string>sm;
int main()
{
cin>>n>>m;//读入n,m;
getchar();//处理输入n,m的换行
while(n--)
{
string s;
getline(cin,s);//由于语句有空格,所以需要用getline读入
sm.push_back(s);
}
while(m--)
{
string key="",value="";
char c;
cin>>key;
while(c=getchar() , c!='\"');
while(c=getchar() , c!='\"') value+=c;
vars[key]=value;
}
for(auto& s:sm)
{
for(int i=0; i < s.size();)
{
if(i+1<s.size() && s[i] == '{' && s[i+1]=='{')
{
string ans;
int j=i+3;
while(s[j]!=' ')
{
ans+=s[j++];
}
cout<<vars[ans];
i=j+3;
}
else//这里加else,因为不然会多输出东西!
cout<<s[i++];
}
cout<<endl;
}
return 0;
}
改了之后,Acwing和官网都ac啦!!!
接下来放y总代码:
#include
#include
#include
#include
#include
using namespace std;
int n, m;
vector<string> strs;
unordered_map<string, string> vars;
int main()
{
cin >> n >> m;
getchar(); // 过滤掉第一行的回车
while (n -- )
{
string str;
getline(cin, str);
strs.push_back(str);
}
while (m -- )
{
string key, value;
cin >> key;
char c;
while (c = getchar(), c != '\"');
while (c = getchar(), c != '\"') value += c;
vars[key] = value;
}
for (auto& str: strs)
{
for (int i = 0; i < str.size();)
if (i + 1 < str.size() && str[i] == '{' && str[i + 1] == '{')
{
int j = i + 3;
string key;
while (str[j] != ' ' || str[j + 1] != '}' || str[j + 2] != '}')
key += str[j ++ ];
cout << vars[key];
i = j + 3;
}
else cout << str[ i ++ ];
cout << endl;
}
return 0;
}
作者:yxc
链接:https://www.acwing.com/activity/content/code/content/872378/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
嗯,今天就这样吧,写完这篇博客也3点了,希望能够对大家有帮助就好!
最重要的是,希望来个大佬指出下我代码bug在哪里呀,也欢迎大家评论区里互相讨论,我们一起学习!