>Link
luogu P1381
ybtoj单词背诵
>解题思路
基本思路:
先计算每个单词的哈希值,找出最多能包含的单词数,即ans1
然后在用尺取法,设当前选择的区间为[l,r]:
- 依次枚举 l l l的位置
- r r r从 l l l开始一个个向后挪,直到挪到 [ l , r ] [l,r] [l,r]中有ans1个不同单词(或边界外)
- 更新ans
- 把 l l l向右移一位,删除原本 l l l上的单词
- 再从步骤一开始,循环下去
hash值有重合,如何快速找到当前这个单词是否在需要背的单词表中?
#1 邻接表 把hash值一样的放在同一个表中,寻找时在表中一个个找是否存当前单词
#2 二分 把需要背的单词表按照每个单词的hash值从小到大排个序,寻找当前单词时按照hash值二分查找
因为第一个方法之前打过了,所以下面只写了第二种方法(其实我觉得第二种方法更简单^)
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
#defin