一:单调栈
利用其单调性及先进后出的特点应用:求从右开始离自己最近比自己大的数的脚标.
所有脚标从一开始,若无目标数即输出0。
例: 5
1 4 2 3 5
输出 2 5 4 5 0
#include<iostream>
#include<stack>
using namespace std;
const int N=1e7;
int a[N],b[N];
int main() {
int n;
stack<int> stk;//stk储存的是脚标
cin>>n;
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
for(int i=n; i>=1; i--)
{
while(!stk.empty()&&a[i]>=a[stk.top()])
stk.pop();
b[i]=stk.empty()?0:stk.top();
stk.push(i);
}
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
return 0;
}
三:trie字典树
例题模板:P8306 【模板】字典树
#include<iostream>
#include<string.h>
using namespace std;
const int N=3*1e6+100;
int tot,cnt[N];
int trie[N][65];
char s1[N];
int cast(char x)
{
if(x>='0'&&x<='9')
return x-'0';//从第零个开始
if(x>='A'&&x<='Z')
return x-'A'+10;//从第十一个数开始
if(x>='a'&&x<='z')
return x-'a'+36;//从第36个开始
}
void insert(char s[])
{
int root=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int step=cast(s[i]);
if(!trie[root][step])//若此处字符已有记录,则只在cnt中记录+1若无记录则开辟新路,tot++
trie[root][step]=++tot;
root=trie[root][step];//使root等于下个字符的索引值以方便遍历下一个字符
cnt[root]++;//不管是否此处字符有记录都+1.
}
}
int find(char s[])
{
int root=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int step=cast(s[i]);
if(!trie[root][step])
return 0;//若此处字符trie树中无记录则说明此字符串不存在于trie中,直接返回0
root=trie[root][step];
}
return cnt[root];//若上述循环正常结束则说明trie中有记录串s,返回其串结尾字符的出现次数
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
for(int i=0;i<=tot;i++)
for(int j=0;j<65;j++)
trie[i][j]=0;
for(int i=0;i<=tot;i++)
cnt[i]=0;
tot=0;//注意一定要先初始化数组再初始tot
int m,q;
scanf("%d%d",&m,&q);
while(m--)
{
scanf("%s",s1);
insert(s1);
}
while(q--)
{
scanf("%s",s1);
int res=find(s1);
printf("%d\n",res);
}
}
return 0;
}
注意cnt数组并非存储的是某个字符出现的次数,而是由于此处:if(!trie[root][step]);trie[root][step]=++tot;因此cnt记录的是含有前缀信息的此处字符出现次数。例如字符a:abcd b:fghd。当插入这两个串并且都遍历到结尾'd'时,由于其前缀不同,所以其tot值也不同,在cnt中所存储的值可能也会由于其两个串的出现次数不同而不同。
数字,字符串Hash:
数字Hash拉链法解决冲突:
const int N=1e8;
int h[N],e[N],ne[N],idx=0;//h需初始化为-1
void Insert(int x)
{
int key=x%99999989;
e[idx]=x;ne[idx]=h[key];h[key]=idx++;
}
bool Find(int x)
{
int key=x%99999989;//取小于hash空间的最大素数
for(int i=h[key];i!=-1;i=ne[i])
{
if(e[i]==x)
return true;
}
return false;
}
字符串Hash开放地址法解决冲突: