专栏文章
P11404 [RMI 2020] 蝶变 / Brperm 题解
P11404题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqcwd2p
- 此快照首次捕获于
- 2025/12/04 02:44 3 个月前
- 此快照最后确认于
- 2025/12/04 02:44 3 个月前
孩子们,调了一晚上结果数据锅了,不保证 /ll
考虑字符串哈希的式子:
可以把它当成生成函数来理解,那么 相当于把字符串中每个字符后面插了一个空格。
然后考虑题目中的变换,现在要求区间 变换后的哈希值,记为 ,假设 是变换好的,它们变换后的哈希值分别记为 ,那么可以得出 。
暴力做就是 的。
然后没有人规定过字符串哈希的 必须是固定的对吧。所以我们在 使用 当底数就可以做到 了。
随便写写就最优解了???
CPP#define maxn 501000
const int P=1000000007;
int pw[20];
int f[20][maxn];
int g[maxn];
bitset<maxn>ok[20];
int n;
void init(int N, const char s[]) {
n=N;
vector<int>p(26);
rep(i,0,25)p[i]=i;
shuffle(p.begin(),p.end(),rnd);
rep(j,0,19)ok[j].set();
pw[19]=20071230;
per(i,18,0)pw[i]=1ll*pw[i+1]*pw[i+1]%P;
rep(i,0,N-1)f[0][i]=p[s[i]-'a'];
rep(j,1,19) {
int B=pw[j];
for(int i=0; i+(1<<j)-1<=N-1; ++i) {
f[j][i]=f[j-1][i]+1ll*f[j-1][i+(1<<(j-1))]*B%P;
if(f[j][i]>=P)f[j][i]-=P;
}
g[N-1]=p[s[N-1]-'a'];
per(i,N-2,0)g[i]=(1ll*g[i+1]*B%P+p[s[i]-'a'])%P;
for(int i=0; i+(1<<j)-1<=N-1; ++i) {
ok[j][i]=(f[j][i]==(g[i]-1ll*g[i+(1<<j)]*pw[0]%P+P)%P);
}
}
}
int query(int i, int k) {
if(i+(1<<k)>n)return 0;
return ok[k][i];
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...