BJ 集训测试11 level&& codeforces 700E

http://www.elijahqi.win/archives/2796
题意:给定一串字符求其等级 对于等级的定义是

字符串中出现至少两次的等级最高的字符串的等级+1

那么有个显然的n^3 暴力dp+hash的做法设dp[i][j]表示i开始长度为j的这段区间的等级是多少 每次直接比较前缀后缀 即可 据说gzez某大佬有hash 的做法可以ac 复杂度o(能过) 我不会..

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 5010
#define mod 1004535809
#define ll unsigned long long
#define g1 131
#define g2 27
using namespace std;
char s[N];ll p1[N],hs1[N];
int dp[N][N];int p2[N],hs2[N];
inline ll calc1(int l,int r){
    return hs1[r]-hs1[l-1]*p1[r-l+1];
}
inline int calc2(int l,int r){
    return ((ll)hs2[r]-(ll)hs2[l-1]*p2[r-l+1]%mod+mod)%mod;
}
inline bool judge(int l,int r){
    bool flag1=1,flag2=1;
    flag1&=calc1(l,r-1)==calc1(l+1,r);
    flag2&=calc2(l,r-1)==calc2(l+1,r);
    return flag1&&flag2;
}
inline bool check(int l1,int r1,int l2,int r2){
    bool flag1=1,flag2=1;
    flag1&=(calc1(l1,r1)==ca
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值