Codeforces 7D
2015-09-30 15:43
357 查看
题目大意:给出一个字符串,长度小于等于5*1e6。定义一个串是k回文的,当且仅当它的前半部分和后半部分是(k-1)回文的,求其所有前缀的回文值得和。
题解:我之前写了一个挫爆了的哈希,待会贴代码,交了20多次都没A,TLE了。然后看看网上的,判回文串实际上记一个前缀哈希值(后进的元素是低位),另一个哈希值(后进的元素是高位),若x[i]=y[i]则说明以i结尾的前缀为回文,那么它的值为dp[i>>1]+1,ans统计一下就好了,然而并不愿意贴我的代码,贴网上的算了。
%%%__debug大神。Dash说:hash岂是你能掌握的?
我太Weak了。
题解:我之前写了一个挫爆了的哈希,待会贴代码,交了20多次都没A,TLE了。然后看看网上的,判回文串实际上记一个前缀哈希值(后进的元素是低位),另一个哈希值(后进的元素是高位),若x[i]=y[i]则说明以i结尾的前缀为回文,那么它的值为dp[i>>1]+1,ans统计一下就好了,然而并不愿意贴我的代码,贴网上的算了。
%%%__debug大神。Dash说:hash岂是你能掌握的?
我太Weak了。
#include<stdio.h> #include<iostream> #include<string.h> #include<set> #include<vector> #include<map> #include<math.h> #include<queue> #include<string> #include<stdlib.h> #include<algorithm> using namespace std; #define N 5001000 #define mod 1000000007 #define hehe 137731735 #define ll __int64 ll n; char s ; ll x , y ; ll dp ; int main(){ ll i,j; while(gets(s)) { dp[0] = 0; for(i=0;s[i];i++) { if('0'<=s[i]&&s[i]<='9') s[i] = s[i]-'0'; else if('a'<=s[i]&&s[i]<='z') s[i] = s[i]-'a'+10; else s[i] = s[i]-'A'+36; } ll len = i; x[0] = 0; ll dou = 1; for(i=1;i<=len;i++){ x[i] = (x[i-1]+s[i-1]*dou)%mod; dou = (dou*hehe)%mod; } y[len+1] = 0; for(i=1;i<=len;i++) { y[i] = (y[i-1]*hehe+s[i-1])%mod;} ll ans = 0; for(i=1;i<=len;i++) if(x[i]==y[i]) { dp[i] = dp[i>>1]+1; ans += dp[i]; } cout<<ans<<endl; } return 0; }
相关文章推荐
- 实模式下,内存说明大全
- JSONP跨域的原理解析( 一种脚本注入行为)
- Android 中数据库查询方法query()中的selectionArgs的用法
- 值得参考的sql语句
- Android Android Studio 快捷键整理分享,IntelliJ IDEA使用技巧一览表
- Kurento模块开发指南之五:开发示例 Plate Detector Filter
- linux下注销其它用户或者tty的命令
- 虚拟机操作记录
- 活用Redis
- JSON格式化、高亮库JSONFORMATER
- EGORefreshTableHeaderView、EGORefreshTableFooterView 列表下拉/上拉刷新: (一)
- int 13 中断
- 编写用户手册感
- 如何识别Java中的内存泄漏
- jquery 重复事件
- 差异与阵列和阵列结构和链表的区别
- 使用正则表达式匹配IP地址
- 安装spket
- 修改表结构的小知识
- Kurento模块开发指南之四:开发示例 Crowd Detector Filter