ACM-ICPC 2018 南京赛区网络预赛 Skr 马拉车+字符串hash+hash表
题目链接:Skr
题意,求不同的回文串的和。
题解:马拉车的时候当找到一个新的回文串时,判断这个回文串的hash值是否在hashmap中,没有就加入然后ans加上这段值,有就不管
#include<bits/stdc++.h> #define ll long long #define ull unsigned long long using namespace std; const int base=23; const int N=2e6+100; const int mod=1e9+7; struct hash {char s[N];ull h[N],qp[N];ll p[N],len,val[N];void init(){h[0]=val[0]=0;qp[0]=p[0]=1;len=strlen(s+1);for(int i=1;i<=len;i++){p[i]=p[i-1]*10%mod;qp[i]=qp[i-1]*base;h[i]=h[i-1]*base+s[i];val[i]=(1LL*val[i-1]*10%mod+s[i]-'0')%mod;}}ull get_hash(int l,int r){return h[r]-h[l-1]*qp[r-l+1];}int get_val(int l,int r){return ((val[r]-val[l-1]*p[r-l+1]%mod)%mod+mod)%mod;} }ac; int mx,len[N],x; ll ans; const int HASH = 1000007; const int maxn=1e7+7; struct hashmap{ll a[maxn];int head[HASH],nxt[maxn],sz;void init(){memset(head,-1,sizeof(head));sz = 0;}bool find(ull val){int tmp = (val%HASH + HASH) % HASH;for(int i = head[tmp] ; ~i ; i = nxt[i]){if(val == a[i]) return true;}return false;}void add(ull val){int tmp = (val%HASH + HASH) % HASH;if(find(val)) return;a[sz] = val;nxt[sz] = head[tmp];head[tmp] = sz ++;} }ap; void ins(int l,int r) {ull h=ac.get_hash(l,r);if(!ap.find(h)){ap.add(h);ans+=ac.get_val(l,r);ans%=mod;} } int main(){scanf("%s",ac.s+1);ac.init();ap.init();//int mx=0,x=0;for(int i=1;i<=ac.len;i++){ins(i,i);if(mx>i)len[i]=min(mx-i,len[2*x-i]);while(i+len[i]+1<=ac.len&&ac.s[i+len[i]+1]==ac.s[i-len[i]-1]){ins(i-len[i]-1,i+len[i]+1);len[i]++;}if(i+len[i]>mx){mx=i+len[i];x=i;}}mx=x=0;memset(len,0,sizeof len);ap.init();for(int i=2;i<=ac.len;i++){if(mx>i)len[i]=min(mx-i+1,len[2*x-i]);while(i+len[i]<=ac.len&&ac.s[i+len[i]]==ac.s[i-len[i]-1]){ins(i-len[i]-1,i+len[i]);len[i]++;}if(i+len[i]-1>mx){mx=i+len[i]-1;x=i;}}printf("%lld\n",ans);return 0; }
转载于:https://www.cnblogs.com/lhclqslove/p/9743229.html
ACM-ICPC 2018 南京赛区网络预赛 Skr 马拉车+字符串hash+hash表相关推荐
- ACM-ICPC 2018 南京赛区网络预赛
轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of gra ...
- ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树
目录 ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树 题面 题意 思路 ACM-ICPC 2018 南京赛区网络预赛 Lpl and En ...
- ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall
题目链接:https://nanti.jisuanke.com/t/30991 2000ms 262144K Feeling hungry, a cute hamster decides to ord ...
- ACM-ICPC 2018 南京赛区网络预赛 AC Challenge
Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...
- ACM-ICPC 2018 南京赛区网络预赛 - AC Challenge(状压DP)
ACM-ICPC 2018 南京赛区网络预赛 - AC Challenge 题意: 有n个题目,每个题目有一些信息,,第 t 个过第 i 题会得到分数 t*ai + bi 在过第 i 题前必须要先过 ...
- ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge(状压dp)
Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...
- E. AC Challenge ACM-ICPC 2018 南京赛区网络预赛 状压dp + 枚举状态
博客目录 原题 题目链接 Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he kn ...
- ACM-ICPC 2018 南京赛区网络预赛 I.Skr(Manacher马拉车+Hash哈希/回文树)
题目 给一个只由数字构成的字符串s(|s|<=2e6) 求s的所有本质不同字符串之和%1e9+7, 每一个不同字符串的贡献为其十进制下的值 思路来源 https://blog.csdn.net/ ...
- ACM-ICPC 2018 南京赛区网络预赛 I Skr (马拉车+hash去重)或(回文树)
https://nanti.jisuanke.com/t/30998 题意 给一串由0..9组成的数字字符串,求所有不同回文串的权值和.比如说"1121"这个串中有"1& ...
最新文章
- SQL Server 表分区实战系列(文章索引)
- v-bind 中a标签的使用
- 一个SQL的几种写法
- “伪基站”任意冒用手机号短信诈骗
- java 通道 双向原理_Java-NIO(四):通道(Channel)的原理与获取
- Weblogic 10.3.5在64位Windows系统下的安装和配置
- 将list的内容转换成固定个数的分组字符串
- 我眼中的“SSD” ..update
- MATLAB GUI新手备忘录
- 活动目录设计中需要遵循的七个原则
- android 反编译jar包
- 小米手机怎么删除桌面计算机,手机桌面图标怎么删除,小米手机怎样删除桌面图标-...
- 语音助手——简介与交互过程
- 练法、打法、演法——回味老罗踢馆这场戏
- 用计算机算e的次方,e的值(万能计算器在线使用)
- Java中识别二维码并且提高二维码的识别率
- Redis基本使用|基本命令|redis事务|Jedis|持久化|订阅|集群|
- 什么是AppImage
- php中单引号双引号那点事---顺便说说把php变量的值传给js
- 关于Office弹窗+横幅提示“你的许可证不是正版,并且你可能是盗版软件的受害者...”的解决方案——以Office2019为例