学大伟业 Day 3 培训总结
今天讲的字符串:
不多说,直接看题
一.表达式求值
题目大意:
输入一行一个表达式,计算其答案 表达式包含非负整数、加减乘除、括号
两种做法
·栈
·表达式树
这里更推荐表达式树,因为栈是先压进去,逆序操作。在进行逆序操作时即从右往左计算,实际应该是从左往右计算,所以会出现计算不符合顺序的问题。从而出现错误。
而表达式树则又称为“表达式目录树”,以数据形式表示语言级代码,它是一种抽象语法树或者说是一种数据结构。——摘自百度百科
可见,每个父节点都是一种运算符,子节点为数字。运算时从底层向上层依次按父节点符号操作子节点即可。
先贴栈的代码:
/*
1+(2+3)*4
21
*/ #include <iostream>
#include <stack>
using namespace std; const int MAXN = + ;
char str[MAXN];
stack<int> nums;
stack<char> symbol; void pop()
{
int a = nums.top();nums.pop();
int b = nums.top();nums.pop();
char s = symbol.top();symbol.pop();
int ans;
switch(s)
{
case '+':ans=a+b;break;
case '-':ans=b-a;break;
case '*':ans=a*b;break;
case '/':ans=b/a;break;
}
nums.push(ans);
}
int main()
{
cin >> (str+);
for(int i=;str[i]!=;i++)
{
char c=str[i];
if(''<=c&&c<='')
{
nums.push(c-'');
} else {
if(c==')')
{
while(symbol.top() != '(') pop();
symbol.pop();
} else if (c=='+' || c=='-')
{
while(!symbol.empty()
&&symbol.top()!='+'
&&symbol.top()!='-'
&&symbol.top()!='(') pop();
symbol.push(c);
} else symbol.push(c);
}
}
while(!symbol.empty())pop();
cout<<nums.top()<<endl; return ;
}
在计算上面图中的例子时,栈会出错。
下面给出表达式树的代码:
/*
10+(2+3)*4
30
*/ #include <iostream>
#include <stack>
#include <cstring>
using namespace std; const int MAXN = + ;
char str[MAXN]; int solve(int l, int r)
{ int pos=-;
int flag=;
int level=; // 0:+- 1:*/
for(int i=l;i<=r;i++)
{
if(str[i]=='(')flag++;
if(str[i]==')')flag--;
if(flag == && (str[i]<''||str[i]>''||str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')&&str[i]!=')')
{
int l=-;
switch(str[i])
{
case '+':case '-':l=;break;
case '*':case '/':l=;break;
}
if(level >= l)
{
level=l;
pos=i;
}
}
}
if(pos==-)
{
if(str[l]=='('&&str[r]==')') return solve(l+,r-);
int x=;
for(int i=l;i<=r;i++)
x=x*+str[i]-'';
return x;
}
int a = solve(l, pos-);
int b = solve(pos+, r);
int ans;
switch(str[pos])
{
case '+':ans=a+b;break;
case '-':ans=a-b;break;
case '*':ans=a*b;break;
case '/':ans=a/b;break; // 3*2/3
}
return ans;
}
int main()
{
cin >> (str+);
cout << solve(, strlen(str+)) << endl; return ;
}
二.字符串统计
题目大意:给定N个字符串,判断不同的字符串有多少个。
做法:hash
所谓hash就是把每个字符串设成一个值,每个字符串的值要不同,所以操作的时候只要弄的奇奇怪怪就好啦(个人理解,不喜勿喷)
这样比较字符串就成了比较数值的问题。
哈希碰撞:所谓哈希碰撞是指在哈希时难免会遇到有重复的数值,解决方案可以为双哈希。
例如:在哈希时会模一个很大的质数,假设这个质数为mod,当遇到某个数m时(m<mod)m % mod = m
但是当遇到另一个数n时,n恰巧为 m + mod 那么 n % mod = m 两串字符对应值都为m,产生了碰撞。
在洛谷有道模板题,链接:https://www.luogu.org/problemnew/show/P3370
hash代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long n;
char s[];
long long ms[]={};
long long ans=; int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
cin>>s; int len=strlen(s);
for(int j=;j<len;j++)
ms[i]=(ms[i]*+(long long)s[j])%+; }
sort(ms+,ms+n+);
for(int i=;i<n;i++)
{
if(ms[i]!=ms[i+])
ans++;
}
printf("%d",ans); }
学大伟业 Day 3 培训总结的更多相关文章
- 学大伟业 Day 1 培训总结
第一天培训,讲的基本算法,东西很多.还有些数论,图论,数据结构and some small tricks 一.输入输出技巧 //输入输出技巧 /* scanf.printf:速度快,需要记忆不同数据类 ...
- 学大伟业 Day 6 培训总结
今天接着昨天的继续讲数据结构 今天先是 分块 在统计问题中,尤其是序列问题,经常涉及到区间的操作,比如修改一段区间的元素,询问某个区间的元素的信息. 如果每次都对一整个区间的每一个元素进行操作的话,那 ...
- 学大伟业 Day 5 培训总结
今天讲数据结构 先从mzx大佬的ppt摘抄一段: 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 通常情况下,精心选择的数据结构可以带来更高的运行或 ...
- 学大伟业 Day 2 培训总结
一.dp 动态规划的本质 是一种思想.通过对原问题划分成子问题,寻找子问题之间的联系,通过求解子问题得出原问题的解.与贪心不同的是,动归是深谋远虑,考虑全局最优解:而贪心则目光短浅,只考虑局部最优解. ...
- 学大伟业 Day 4 培训总结
今天讲的全是dp... 不多废话,先看一道经典的模板LIS(最长不下降子序列) 一.LIS 给定一个长度为N的数列,求最长上升子序列 例:1 7 2 8 3 4 答案:1 2 3 4 代码: #inc ...
- 学大伟业Day1解题报告
学大伟业Day1解题报告 张炳琪 一. 时间分配 T1:30分钟 T2: 60分钟 T3:100分钟 二.答题情况及错因 T1:100 T2:55 T3 ...
- 学大伟业 2017 国庆 Day1
期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...
- 2017-10-23学大伟业Day1
T1 叉叉 题目名称 叉叉 程序文件名 cross 输入文件名 cross.in 输出文件名 cross.out 每个测试点时限 1秒 内存限制 128MB 测试点数目 10 每个测试点分值 10 是 ...
- 学大伟业 国庆Day2
期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) [问题描述] 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个 ...
随机推荐
- 【程序员技术练级】学习一门脚本语言 python(二)遍历本地文件系统
这篇将讲述怎么使用python来遍历本地文件系统,并把文件按文件大小从小到大排序的一个小例子 在这个例子中,主要会用到python内置的和OS模块的几个函数: os.walk() : 该方法用来遍历指 ...
- 在ZYNQ-7000平台上利用PS点亮PL上的LED灯
在ZYNQ-7000平台上利用PS点亮PL上的LED灯 1.实验方案 图1 实验方案系统框图 2.具体步骤 2.1.vivado工程建立 ①打开vivado集成开发环境,点击“Create Pr ...
- [Matlab] awgn
Y = awgn(X,SNR,SIGPOWER) when SIGPOWER is numeric, it represents the signal power in dBW. When SIGPO ...
- 介绍几种搭建Dojo环境的方法
Hello World! 的时间到了,在你所学过的众多语言中,哪个不是从此学起的呢?但在此之前,我们要先构建一个开发环境,如同刚开始学习Java的时候,还是需要我们先安装JDK.配置好环境变量等等,H ...
- [转]ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器
本文转自:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html 原文:Filters 作者:Steve Smith 翻 ...
- [转]Wrapping multiple calls to SaveChanges() in a single transaction
本文转自:http://www.binaryintellect.net/articles/165bb877-27ee-4efa-9fa3-40cd0cf69e49.aspx When you make ...
- 网站部署中遇到的问题-网页中js,css和图片资源无法加载
问题描述: 打开的网页跑版,图片无法加载,用控制台调试发现css和js都没有加载. 原因: 没有启用IIS"静态内容". 解决方法: 设置"打开或关闭windows功能& ...
- javascript方法重载惹的祸
先贴出代码,看看执行结果会是什么? function ShowMsg() { //函数1 this.sure = function () { alert("ok"); }; //函 ...
- 一个简单问题引发对IEnumerable和IQueryable的思考
问题概述: 首先看下图,有客户表和客户负责人表关系是多对多,访问数据库使用的是EF所以这里我们开启了延迟加载,需求就是将每个客户的所有负责人逗号拼接显示在负责人这一栏位, 对你没看错需求就是这么 ...
- IO流之转换流
转换流 OutputStreamWriter类 查阅OutputStreamWriter的API介绍,OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流 ...