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