今天学了一下午字符串,讲到结束也没讲KMP。有人问老师为什么不讲,老师来一句:字符串noip不考,而且还是18禁,自然不讲。【手动滑稽】

所以我也不讲。【微笑】

1.表达式树

表示3+5*8

最后计算的符号是根节点,是一课二叉树,左右子树可以是数或式。

例题:表达式计算

代码如下

/*
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) // 璁$畻杈撳叆鐨勮〃杈惧紡[l,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]=='/'))
{
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 ;
}

这道题还有一个栈的做法

代码如下

/*
1+(2+3)*4
21
*/
// 鍋囪杈撳叆鐨勬暟瀛楀湪[0,9] #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; // 3*2/3
}
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 ;
}

2.hash(搞一个233进制数)&&trie树

例题:字符串统计

const int P = , MOD = ;

int hash(char* str)
// 瑕佹眰鐩稿悓瀛楃涓茶繑鍥炵殑瀛楃涓插繀椤荤浉鍚?
// 涓嶅悓鐨勫瓧绗︿覆杩斿洖鍊煎敖閲忎笉鍚?
{
int ans=;
for(int i=;str[i];i++)
ans=(ans*P+str[i])%MOD;
return ans;
}
vector<string> L[MOD];
int main()
{
int n;
cin >> n;
char str[ + ];
while(n--)
{
cin>>str;
int h=hash(str);
bool same=false;
for(int i=;i<(int)L[h].size()&&!same;i++)
if(str==L[h][i])
same=true;
puts(same ? "YES" : "NO");
if(!same) L[h].push_back(str);
}
}
/*hash*/
const int MAXN =  + ;

struct Node
{
int son[];
int mark;
};
Node tree[MAXN*];
int root=, op=; bool insert(char* str) // 鎻掑叆瀛楃涓诧紝杩斿洖璇ュ瓧绗︿覆鏄惁宸茬粡鍑虹幇杩?
{
int pos=root;
for(int i=;str[i];i++)
{
int c=str[i]-'a';
if(tree[pos].son[c] == ) tree[pos].son[c] = ++op;
pos = tree[pos].son[c];
}
int mark=tree[pos].mark;
tree[pos].mark=;
return mark!=;
}
int main()
{
int n;
cin >> n;
char str[ + ];
while(n--)
{
cin>>str;
puts(insert(str) ? "YES" : "NO");
}
}
/*trie树*/

例题:情书

const int MAXN =  + ;

struct Node
{
int son[];
int mark;
int time; // 琛ㄧず鏈€鏂板尮閰嶇殑鏄摢鍙ヨ瘽
};
Node tree[MAXN*];
int root=, op=;
char str[ + ];
int cnt, ans;
// cnt琛ㄧず褰撳墠姝e湪澶勭悊鐨勫崟璇嶆槸绗嚑鍙ヨ瘽 void insert(char* str) // 鎻掑叆瀛楃涓?
{
int pos=root;
for(int i=;str[i];i++)
{
int c=str[i]-'a';
if(tree[pos].son[c] == ) tree[pos].son[c] = ++op;
pos = tree[pos].son[c];
}
tree[pos].mark=;
}
void search(char* str)
{
int pos=root;
for(int i=;str[i];i++)
{
int c=str[i]-'a';
if(tree[pos].son[c] == ) return;
pos = tree[pos].son[c];
}
if(tree[pos].mark== && tree[pos].time!=cnt)
ans++;
tree[pos].time=cnt;
}
int main()
{
int n;
cin >> n;
while(n--)
{
cin>>str;
insert(str);
}
cnt=;
while(cin>>str)
{
int len=strlen(str);
bool juzi=false;
if(str[len-]=='.')
{
juzi=true;
str[len-]='\0';
}
search(str);
if(juzi)
{
cout<<ans<<endl;
ans=;
cnt++;
}
}
}

例题:LCP(最长公共前缀hash做法)

const int P = , MOD = ;
char str[MAXN];
long long H[MAXN];
long long POW[MAXN]; int main()
{
cin>>str+;
n=strlen(str+);
for(int i=;i<=n;i++)
H[i]=(H[i-]*P+str[i])%MOD;
POW[]=;
for(int i=;i<=n;i++)
POW[i]=(POW[i-]*P)%MOD;
int A, B;
while(cin>>A>>B)
{
int l=, r=min(n-A+, n-B+), mid;
while(l<r)
{
mid=(l+r)/+; // l=0, r=1 [0, 1]/[-1, 0]
// h1涓簊tr[A~A+mid-1]鐨刪ash鍊?
long long h1=((H[A+mid-]-H[A-]*POW[mid])%MOD+MOD)%MOD;
long long h2=((H[B+mid-]-H[B-]*POW[mid])%MOD+MOD)%MOD;
if(h1==h2)l=mid;
else r=mid-;
}
}
} // -9 % 4 = (-1 + 4) % 4 = 3

字符串-----KMP竟然是18禁的更多相关文章

  1. hdu 5510 Bazinga(字符串kmp)

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  2. hdu1686字符串kmp

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

  3. 模板—字符串—KMP(单模式串,单文本串)

    模板—字符串—KMP(单模式串,单文本串) Code: #include <cstdio> #include <cstring> #include <algorithm& ...

  4. 数据结构(复习)---------字符串-----KMP算法(转载)

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  5. 字符串(KMP):BZOJ 3670 [Noi2014]动物园

    3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1521  Solved: 813[Submit][Status] ...

  6. 字符串 - KMP模式匹配

    在朴素的模式匹配算法中,主串的pos值(i)是不断地回溯来完成的(见字符串的基本操作中的Index函数).而计算机的大仙们发现这种回溯其实可以是不需要的.既然i值不回溯,也就是不可以变小,那么考虑的变 ...

  7. 【poj 2752】Seek the Name, Seek the Fame(字符串--KMP)

    题意:给出一个字符串str,求出str中存在多少子串,使得这些子串既是str的前缀,又是str的后缀.从小到大依次输出这些子串的长度. 解法:利用KMP中next[ ]数组的性质,依次找到前缀.后缀匹 ...

  8. 【poj 1961】Period(字符串--KMP 模版题)

    题意:给你一个字符串,求这个字符串到第 i 个字符为止的重复子串的个数. 解法:判断重复子串的语句很重要!!if (p && i%(i-p)==0) printf("%d % ...

  9. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

    涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...

随机推荐

  1. WCF使用安全证书验证消息加密

    首先安装 服务端安全证书  代码如下:  // 下面第一行是安装证书,第二行是将证书列入信任 makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=lo ...

  2. Python数据可视化:网易云音乐歌单

    通过Python对网易云音乐华语歌单数据的获取,对华语歌单数据进行可视化分析. 可视化库不采用pyecharts,来点新东西. 使用matplotlib可视化库,利用这个底层库来进行可视化展示. 推荐 ...

  3. 20145328 《Java程序设计》第2周学习总结

    20145328 <Java程序设计>第2周学习总结 教材学习内容总结 掌握了上周没有学会的IDEA的用法 掌握了一些快捷键用法,在用IDEA编写程序的过程中的体验比直接使用cmd进行编写 ...

  4. Java基础东西(按位操作运算)

    http://aokunsang.iteye.com/blog/615658 前奏:   昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊, ...

  5. Ubuntu16.04安装搜狗拼音输入法(中文输入法)[转]

    本文转载自:https://www.cnblogs.com/darklights/p/7722861.html 虽然网上有很多教程,但是我觉得我的很适合那些真正的小白... 1.下载文件 由于我要给多 ...

  6. 【python】argparse学习(转)

    点击这里成为作者 · 更新于 2018-11-14 21:00:36 argparse argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数, ...

  7. MATLAB 图形图像处理

    theme: MATLAB author: pprp date: 2018/2/2 --- MATLAB 图形图像处理 二维绘图命令 plot 线性空间 plot(t,[x1,x2,x3]) : 在同 ...

  8. Unique Binary Search Trees,Unique Binary Search Trees2 生成二叉排序树

    Unique Binary Search Trees:求生成二叉排序树的个数. Given n, how many structurally unique BST's (binary search t ...

  9. 关于JNDI那点事

    一.JNDI是什么? JNDI--Java 命名和目录接口(Java Naming and Directory Interface),是一组在Java应用中访问命名和目录服务的API. 二.JNDI好 ...

  10. kubernetes源码分析 -- kube-proxy

       Kube-proxy需要在每一个minion结点上运行.他的作用是service的代理,负责将业务连接到service后面具体执行结点(endpoints). 我们列一下体现kube-proxy ...