#include<iostream>usingnamespace std;constint N =100010;int n ;int stk[N], tt;intmain(){
cin >> n;for(int i =0; i < n ; i++){int x;
cin >> x;while(tt && stk[tt]>= x) tt--;if(tt !=0) cout << stk[tt]<<" ";else cout <<-1<<" ";
stk[++ tt]= x;}return0;}
fila monótona (janela deslizante)
#include<iostream>usingnamespace std;constint N =1000010;int n , k;int a[N], q[N];//a存值,q是单调队列 intmain(){scanf("%d%d",&n ,&k);for(int i =0; i < n ; i++)scanf("%d",&a[i]);int hh =0, tt =-1;for(int i=0; i < n ; i++){//判断队头是否已经划出窗口if(hh <= tt && i - k +1> q[hh]) hh++;//q[hh]存放的下标 while(hh <= tt && a[q[tt]]>= a[i]) tt--;//之前的数字比当前的大,出队
q[++ tt ]= i;if(i >= k -1)printf("%d ", a[q[hh]]);}puts(" ");
hh =0, tt =-1;//队列要清空 for(int i=0; i < n ; i++){//判断队头是否已经划出窗口if(hh <= tt && i - k+1> q[hh]) hh++;//q[hh]存放的下标 while(hh <= tt && a[q[tt]]<= a[i]) tt--;//之前的数字比当前的小,出队
q[++ tt ]= i;if(i >= k -1)printf("%d ", a[q[hh]]);}puts(" ");return0;}
km²
#include<iostream>usingnamespace std;constint N =10010, M =100010;int n , m;char p[N], s[M];int nex[N];intmain(){
cin >> n >> p +1>> m >> s +1;//p是子串 , s是模式串 //求next的过程for(int i =2, j =0; i <= n ; i++){while(j && p[i]!= p[j +1]) j = nex[j];if(p[i]== p[j +1]) j++;
nex[i]= j;}//kmp匹配过程 for(int i =1, j =0; i <= m ; i++){while(j && s[i]!= p[j +1]) j = nex[j];//j没有退回起点,if(s[i]== p[j +1]) j++;if(j == n){printf("%d", i - n);
j = nex[j];
cout << endl << j <<endl;}}return0;}
Trie
#include<iostream>usingnamespace std;constint N =100010;int son[N][26], cnt[N], idx;char str[N];voidinsert(char str[]){int p =0;for(int i =0; str[i]; i++){int u = str[i]-'a';if(!son[p][u]) son[p][u]=++idx;
p = son[p][u];}
cnt[p]++;//给末尾的结点打标记 }intquery(char str[]){int p =0;for(int i =0; str[i]; i++){int u = str[i]-'a';if(!son[p][u])return0;
p = son[p][u];}return cnt[p];}intmain(){int n;scanf("%d",&n);while(n--){char op[2];scanf("%s%s", op , str);if(op[0]=='I')insert(str);elseprintf("%d\n",query(str));}return0;}////5//I abc//Q abc//Q ab//I ab//Q ab