[HackerRank-World CodeSprint 6]Functional Palindromes
来源:互联网 发布:贵州大数据发展报告 编辑:程序博客网 时间:2024/06/10 22:07
题目大意
在字符串
其中
现在给定一个长度为
两个本质相同,起始位置不同的回文子串视作两个不同的串。
题目分析
既然题目询问的是回文子串的函数值,那么我们考虑构出回文树,这样每一个回文子串的
现在的问题是我怎么找到排名为
如果你使用回文平衡树那这个操作就是模板了。有没有其他方法呢?我们直接快排,比较两个子串的大小关系可以通过求出它们的
代码实现
#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <cctype>using namespace std;typedef long long LL;template <typename T>void read(T &x){ x=0; int f=1;char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); x*=f;}int buf[30];void write(int x){ if (x<0) putchar('-'),x=-x; for (;x;x/=10) buf[++buf[0]]=x%10; if (!buf[0]) buf[++buf[0]]=0; for (;buf[0];putchar('0'+buf[buf[0]--]));}const int A=100001;const int P=1000000007;const int N=100050;const int C=26;const int MOD=998244353;const int P1=67;const int P2=89;typedef pair<int,int> PI;#define mkp(a,b) make_pair(a,b)#define ft first#define sd secondPI operator+(PI x,PI y){return mkp((x.ft+y.ft)%MOD,(x.sd+y.sd)%MOD);}PI operator-(PI x,PI y){return mkp((x.ft-y.ft+MOD)%MOD,(x.sd-y.sd+MOD)%MOD);}PI operator*(PI x,PI y){return mkp(1ll*x.ft*y.ft%MOD,1ll*x.sd*y.sd%MOD);}PI POW[N],IPOW[N],p,ip,preh[N];int node[N],pw[N],srt[N];LL sum[N];char s[N];int n,q,cnt;int quick_power(int x,int y){ int ret=1; for (;y;y>>=1,x=1ll*x*x%MOD) if (y&1) ret=1ll*ret*x%MOD; return ret;}struct Palindrome_tree{ int fail[N],len[N],hash[N],st[N]; int nxt[N][C]; int tot,suf; LL size[N]; int newnode() { fail[++tot]=0; for (int c=0;c<C;++c) nxt[tot][c]=0; size[tot]=0; return tot; } void init() { tot=-1,len[newnode()]=0,len[newnode()]=-1; fail[0]=fail[1]=1,suf=1; } int getfail(int x,int pos){return s[pos-len[x]-1]==s[pos]?x:getfail(fail[x],pos);} void insert(int pos) { int p=getfail(suf,pos),c=s[pos]-'a'; if (!nxt[p][c]) { int np=newnode(); len[np]=len[p]+2,fail[np]=nxt[getfail(fail[p],pos)][c],nxt[p][c]=np,st[np]=pos-len[np]+1; hash[np]=(1ll*hash[p]*A+1ll*s[pos]*(1+(p!=1)*pw[len[np]-1]))%P; } ++size[suf=nxt[p][c]]; } void calc(){for (int x=tot;x>=1;--x) if (x!=1) size[fail[x]]+=size[x];}}pam;void pre(){ pw[0]=1; for (int i=1;i<=n;++i) pw[i]=1ll*pw[i-1]*A%P; POW[0]=mkp(1,1),p=mkp(P1,P2); for (int i=1;i<=n;++i) POW[i]=POW[i-1]*p; IPOW[0]=mkp(1,1),ip=mkp(quick_power(P1,MOD-2),quick_power(P2,MOD-2)); for (int i=1;i<=n;++i) IPOW[i]=IPOW[i-1]*ip; for (int i=1;i<=n;++i) preh[i]=preh[i-1]+(POW[i-1]*mkp(s[i]-'a',s[i]-'a'));}PI gethash(int x,int l){return (preh[x+l-1]-preh[x-1])*IPOW[x-1];}int LCP(int x,int y,int len){ int ret=0,l=1,r=len; for (int mid;l<=r;) { mid=l+r>>1; if (gethash(x,mid)==gethash(y,mid)) l=(ret=mid)+1; else r=mid-1; } return ret;}bool cmp(int x,int y){ int len=min(pam.len[x],pam.len[y]),lcp; lcp=LCP(pam.st[x],pam.st[y],len); return !(lcp==pam.len[y])&&(lcp==pam.len[x]||s[pam.st[x]+lcp]<s[pam.st[y]+lcp]);}int main(){ freopen("fpalindrome.in","r",stdin),freopen("fpalindrome.out","w",stdout); read(n),read(q); scanf("%s",s+1),s[0]='#',pre(); pam.init(); for (int i=1;i<=n;++i) pam.insert(i),node[i]=pam.suf; pam.calc(); for (int i=2;i<=pam.tot;++i) srt[++cnt]=i; sort(srt+1,srt+cnt+1,cmp); sum[0]=0; for (int i=1;i<=cnt;++i) sum[i]=sum[i-1]+pam.size[srt[i]]; for (LL x;q--;putchar('\n')) { read(x); if (x>sum[cnt]) write(-1); else { int ret=0,l=1,r=cnt; for (int mid;l<=r;) { mid=l+r>>1; if (sum[mid]<x) l=(ret=mid)+1; else r=mid-1; } write(pam.hash[srt[++ret]]); } } fclose(stdin),fclose(stdout); return 0;}
0 0
- [HackerRank-World CodeSprint 6]Functional Palindromes
- World CodeSprint #4[HackerRank]
- 【hackerrank】World CodeSprint 11 T4
- 【hackerrank】World CodeSprint 11 T6
- Hackerrank World CodeSprint 9 Box Operations
- HackerRank Palindromes
- hackerrank University CodeSprint玩耍记
- 【HackerRank】Functional Palindromes(回文树+后缀数组+lcp排序+字符串哈希+二分)
- [HackerRank University Codesprint]Bob and Ben
- [HackerRank University CodeSprint]Unique Divide And Conquer
- [HackerRank University CodeSprint]Counting On a Tree
- Hackerrank University CodeSprint 2 Querying Sums on Strings
- Hankerrank World CodeSprint #4 Gridland Provinces (字符串双hash )
- hackerRank
- HackerRank
- HackerRank
- HackerRank
- HackerRank
- Java设计模式之责任链模式
- 一次算法的实践(跟进中。。)
- 介绍一下Struts的ActionServlet类
- JAVA的定时任务
- Servlet练习题
- [HackerRank-World CodeSprint 6]Functional Palindromes
- Mybatis查询延迟加载
- echars 地图应用
- 数据库没有对约束设置名称如何删除约束(oracle)
- 安卓中使图片进行旋转(资源整理)
- Spring Boot 学习16--处理静态资源
- 2017暑期实习招聘-产品经理-腾讯IMG(1)
- Xilinx ISE Design Suite 仿真使用图文教程
- sublime text3不识别项目目录的中文名字和调整侧边栏字体大小