字符串hash——洛谷P1117 优秀的拆分
2017-06-09 11:39
204 查看
https://www.luogu.org/problem/show?pid=1117
这里讲一95分的算法;
就是用字符串hash取搞;
怎么弄呢?
我们枚举AA
所有的AA
用字符串hash取判断A和A是否相同;
然后记录AA的开头位置和结尾位置;
然后乘法原理统计答案就好了;
这里讲一95分的算法;
就是用字符串hash取搞;
怎么弄呢?
我们枚举AA
所有的AA
用字符串hash取判断A和A是否相同;
然后记录AA的开头位置和结尾位置;
然后乘法原理统计答案就好了;
#include<bits/stdc++.h> #define pow fuck #define Ll long long using namespace std; const int N=2e3+5; Ll A ,B ,hush ,pow ; Ll S=999983,mo=1e8+9,ans; int n,m; char c ; Ll get(int x,int y){return (hush[y]-hush[x-1]*pow[y-x+1]%mo+mo)%mo;} int main() { scanf("%d",&m); pow[0]=1; for(int i=1;i<=N;i++)pow[i]=pow[i-1]*S%mo; while(m--){ scanf("%s",c+1); n=strlen(c+1); for(int i=1;i<=n;i++)hush[i]=(hush[i-1]*S+c[i]-96)%mo; memset(A,0,sizeof A); memset(B,0,sizeof B); for(int i=1;i<=n;i++) for(int j=i;j+j-i-1<=n;j++) if(get(i,j)==get(j+1,j+j-i+1)) A[i]++,B[j+j-i+1]++; ans=0; for(int i=1;i<n;i++)ans+=B[i]*A[i+1]; printf("%lld\n",ans); } }
相关文章推荐
- mycat1.6.5分片(字符串拆分hash)
- 【BZOJ4650&UOJ219】优秀的拆分(二分,hash)
- ELFhash - 优秀的字符串哈希算法
- ELFhash - 优秀的字符串哈希算法
- [后缀数组 枚举 字符串分段] BZOJ 4650 [Noi2016]优秀的拆分
- bzoj4650: [Noi2016]优秀的拆分 hash
- 字符串(后缀自动机):NOI 2016 优秀的拆分
- 洛谷P1117:[NOI2016]优秀的拆分(后缀自动机)
- [POI 2012]Prefixuffix(字符串Hash)
- sqlserver字符串拆分(split)方法汇总
- 运用双链表实现字符串的拆分,去重,检测回文
- C++拆分字符串代码(实现split)
- poj3007 Organize Your Train part II, 字符串hash
- 字符串拆分為列表(函數)
- UOJ #219 [NOI2016 D1T1] 优秀的拆分 [95分]
- 优秀的boost字符串处理
- PHP字符串拆分函数之mb_substr
- 文本文件存在字符串数组,再按指定行截取,可以用来拆分文件。打印显示效果
- poj3690 Constellations 字符串Hash
- SQLServer拆分字符串到临时表