今天讲的字符串:

不多说,直接看题

一.表达式求值

题目大意:

输入一行一个表达式,计算其答案 表达式包含非负整数、加减乘除、括号

两种做法

·栈

·表达式树

这里更推荐表达式树,因为栈是先压进去,逆序操作。在进行逆序操作时即从右往左计算,实际应该是从左往右计算,所以会出现计算不符合顺序的问题。从而出现错误。

而表达式树则又称为“表达式目录树”,以数据形式表示语言级代码,它是一种抽象语法树或者说是一种数据结构。——摘自百度百科

可见,每个父节点都是一种运算符,子节点为数字。运算时从底层向上层依次按父节点符号操作子节点即可。

先贴的代码:

 /*
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 培训总结的更多相关文章

  1. 学大伟业 Day 1 培训总结

    第一天培训,讲的基本算法,东西很多.还有些数论,图论,数据结构and some small tricks 一.输入输出技巧 //输入输出技巧 /* scanf.printf:速度快,需要记忆不同数据类 ...

  2. 学大伟业 Day 6 培训总结

    今天接着昨天的继续讲数据结构 今天先是 分块 在统计问题中,尤其是序列问题,经常涉及到区间的操作,比如修改一段区间的元素,询问某个区间的元素的信息. 如果每次都对一整个区间的每一个元素进行操作的话,那 ...

  3. 学大伟业 Day 5 培训总结

    今天讲数据结构 先从mzx大佬的ppt摘抄一段: 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合. 通常情况下,精心选择的数据结构可以带来更高的运行或 ...

  4. 学大伟业 Day 2 培训总结

    一.dp 动态规划的本质 是一种思想.通过对原问题划分成子问题,寻找子问题之间的联系,通过求解子问题得出原问题的解.与贪心不同的是,动归是深谋远虑,考虑全局最优解:而贪心则目光短浅,只考虑局部最优解. ...

  5. 学大伟业 Day 4 培训总结

    今天讲的全是dp... 不多废话,先看一道经典的模板LIS(最长不下降子序列) 一.LIS 给定一个长度为N的数列,求最长上升子序列 例:1 7 2 8 3 4 答案:1 2 3 4 代码: #inc ...

  6. 学大伟业Day1解题报告

    学大伟业Day1解题报告 张炳琪 一.   时间分配 T1:30分钟  T2: 60分钟  T3:100分钟 二.答题情况及错因 T1:100         T2:55             T3 ...

  7. 学大伟业 2017 国庆 Day1

    期望得分:100+100+20=220 实际得分:100+100+20=220 (好久没有期望==实际了 ,~\(≧▽≦)/~) 对于 a........a 如果 第1个a 后面出现的第1个b~z 是 ...

  8. 2017-10-23学大伟业Day1

    T1 叉叉 题目名称 叉叉 程序文件名 cross 输入文件名 cross.in 输出文件名 cross.out 每个测试点时限 1秒 内存限制 128MB 测试点数目 10 每个测试点分值 10 是 ...

  9. 学大伟业 国庆Day2

    期望得分:30+100+0=130 实际得分:30+100+20=150 忍者钩爪 (ninja.pas/c/cpp) [问题描述] 小Q是一名酷爱钩爪的忍者,最喜欢飞檐走壁的感觉,有一天小Q发现一个 ...

随机推荐

  1. TOJ 4008 The Leaf Eaters(容斥定理)

    Description As we all know caterpillars love to eat leaves. Usually, a caterpillar sits on leaf, eat ...

  2. 修改K3数据是简介方法

    如  及时库存里有个别产品库存没有库位  是*号的 这个时候  我们创建一个其他出库单,把这个没有库位的产品输入进去,库位随便写个 如002 保存,审核不了的  会提示负库存 去后台找到此单据号 修改 ...

  3. 虚拟环境--pipenv

    1.安装pipenv,这个工具属于python3 升级pip : pip3 install pipenv 2.在项目中创建虚拟环境 3.激活虚拟环境,进入虚拟环境 进入虚拟环境之前: pipenv s ...

  4. linux安装git、node、pm2

    一.安装Git 下载:# wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz 解压:# tar -zxvf git-2. ...

  5. Ling之select

    select用法: 1.Dictionary<string, string>转json Newtonsoft.Json.JsonConvert.SerializeObject(dicSub ...

  6. spring cloud Eureka 服务注册发现与调用

    记录一下用spring cloud Eureka搭建服务注册与发现框架的过程. 为了创建spring项目方便,使用了STS. 一.Eureka注册中心 1.新建项目-Spring Starter Pr ...

  7. Java内部类详解 2

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  8. java集合框架(二):HashTable

    HashTable作为集合框架中的一员,现在是很少使用了,一般都是在面试中会问到其与HashMap的区别.为了能在求职的时候用上场,我们有必要对其原理进行解读. HashTable的实现原理跟Hash ...

  9. oracle学习篇三:SQL查询

    select * from emp; --1.找出部门30的员工select * from emp where deptno = 30; --2.列出所有办事员(CLERK)的姓名,变化和部门编号se ...

  10. JavaScirpt(JS)的this细究

    一.js中function的不同形态 js中类和函数都要通过function关键字来构建. 1.js中当函数名大写时,一般是当作类来处理 function Foo(name, age) { this. ...