学大伟业 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发现一个 ...
随机推荐
- VMware虚拟网卡设置问题
具体操作过程如下: (1)为虚拟机添加虚拟网卡 (2)添加后会自动分配子网ip,不用修改.点击应用,确定. (3)添加完成后本机的网络上会多出一个网络适配器,根据虚拟机器中的ip设置此ip地址, 这里 ...
- poi excel 常用api
http://www.cnblogs.com/huajiezh/p/5467821.html
- 深入理解JavaScript系列(8):S.O.L.I.D五大原则之里氏替换原则LSP
前言 本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第3篇,里氏替换原则LSP(The Liskov Substitution Principle ). 英文原文:http ...
- div内容溢出
前几天遇到一个问题,代码是这样一个层次: <div class="province"> <ul> <li>1</li> <li ...
- ThreadPoolExecutor实现原理
转载:https://blog.csdn.net/yanyan19880509/article/details/52718497 前言 做java开发的,一般都避免不了要面对java线程池技术,像to ...
- PAT 1056 Mice and Rice
#include <cstdio> #include <climits> #include <cstdlib> #include <vector> #i ...
- Drupal theme_hook
模板语言和主题引擎 用Drupal的行话来说,主题就是一组负责你站点外观的文件.你可以从http://drupal.org/project/Themes下载第 3方主题,或者你可以自己动手创建一个主题 ...
- spark编程python实例
spark编程python实例 ValueError: Cannot run multiple SparkContexts at once; existing SparkContext(app=PyS ...
- 转:ArcInfo数据格式介绍
ArcInfo常用以下格式的数据:shp.Coverage..Raster CAD和Geodatabase.各种数据的组织形式不一样,其中shp.Coverage.Raster.CAD为文件类型,Ge ...
- TextView来实现跑马灯的效果
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...