2015 UESTC Training for Search Algorithm & String - M - Palindromic String【Manacher回文串】
O(n)的复杂度求回文串:Manacher算法
定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串
现在给一个2*10^6长度的字符串,求其每个前缀的最大回文值之和。
设dp[i]为长度为i的前缀的最大回文值。
当长度为i的前缀的字符串是回文串的时候,有:dp[i]=dp[i/2]+1
若不是回文串 dp[i]=0
接下来就是怎么样快速的判断回文串了,推荐算法Manacher算法。
Manacher算法先对字符串进行修改 如 aba -> $#a#b#a#
那么该怎么用DP求?
显然一下几点是满足的:
如果某个前缀是回文串,该前缀的末端一定是字符#,(因为第一个符号是#)
故对于不是字符#的位置,它的dp值一定为0
如果最大延伸数组p[i]=i,即向左正好延伸到最左边,那么1~p[i]+i-1一定是一个回文前缀
若第i位是#号 : dp[mx]=dp[i] 其中mx=p[i]+i-1
对于不是#的情况 : dp[mx]=dp[i-1] 其中mx=p[i]+i-1
- #include<bits/stdc++.h>
- #define eps 1e-9
- #define FOR(i,j,k) for(int i=j;i<=k;i++)
- #define MAXN 4000005
- #define MAXM 40005
- #define INF 0x3fffffff
- #define PB push_back
- #define MP make_pair
- #define X first
- #define Y second
- #define lc (k<<1)
- #define rc ((k<<1)1)
- using namespace std;
- typedef long long LL;
- int i,j,k,n,m,x,y,T,ans,big,cas,num,len;
- bool flag;
- int p[MAXN],dp[MAXN];
- char str[MAXN],s[MAXN];
- void kp()
- {
- int i;
- int mx = ;
- int id;
- for(i=n; str[i]!=; i++)//清除n后边多余的部分
- str[i] = ; //没有这一句有问题。。就过不了ural1297,比如数据:ababa aba
- for(i=; i<n; i++)
- {
- if( mx > i )
- p[i] = min( p[*id-i], p[id]+id-i );
- //因为是从左往右扫描的这里i>id, 2*id-i是i关于id的对称点,该对称点在id的左端
- //p[id]+id是描述中的mx,即id向右延伸的端点位置
- //显然向右延伸是可能超出mx的,所以要有下边的for循环
- else
- p[i] = ;
- for(; str[i+p[i]] == str[i-p[i]]; p[i]++);
- if( p[i] + i > mx )//更新mx与id,因为mx是向右延伸的最大长度,所以实时更新
- {
- mx = p[i] + i;
- id = i;
- }
- }
- }
- void init()//处理字符串
- {
- int i, j, k;
- str[] = '$';
- str[] = '#';
- for(i=; i<n; i++)
- {
- str[i*+] = s[i];
- str[i*+] = '#';
- }
- n = n*+;
- s[n] = ;
- }
- int main()
- {
- scanf("%s",s);
- n=strlen(s);
- init();
- kp();
- for (i=;i<n;i++)
- {
- if (p[i]==i)
- {
- int mx=p[i]+i-;
- if (str[i]!='#')
- {
- dp[mx]=max(dp[mx],dp[i-]+);
- }else
- dp[mx]=max(dp[mx],dp[i]+);
- }
- }
- int sum=;
- for (i=;i<n;i++) sum+=dp[i];
- printf("%d\n",sum);
- return ;
- }
2015 UESTC Training for Search Algorithm & String - M - Palindromic String【Manacher回文串】的更多相关文章
- UESTC_Palindromic String 2015 UESTC Training for Search Algorithm & String<Problem M>
M - Palindromic String Time Limit: 3000/1000MS (Java/Others) Memory Limit: 128000/128000KB (Java ...
- UESTC_韩爷的梦 2015 UESTC Training for Search Algorithm & String<Problem N>
N - 韩爷的梦 Time Limit: 200/100MS (Java/Others) Memory Limit: 1300/1300KB (Java/Others) Submit Stat ...
- UESTC_Ferris Wheel String 2015 UESTC Training for Search Algorithm & String<Problem L>
L - Ferris Wheel String Time Limit: 3000/1000MS (Java/Others) Memory Limit: 43000/43000KB (Java/ ...
- UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>
K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others) Memory Limit: 32000/32000KB (Java/Others) Su ...
- UESTC_Eight Puzzle 2015 UESTC Training for Search Algorithm & String<Problem F>
F - Eight Puzzle Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) ...
- UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm & String<Problem E>
E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_基爷的中位数 2015 UESTC Training for Search Algorithm & String<Problem D>
D - 基爷的中位数 Time Limit: 5000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- UESTC_基爷与加法等式 2015 UESTC Training for Search Algorithm & String<Problem C>
C - 基爷与加法等式 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Subm ...
- UESTC_邱老师降临小行星 2015 UESTC Training for Search Algorithm & String<Problem B>
B - 邱老师降临小行星 Time Limit: 10000/5000MS (Java/Others) Memory Limit: 65536/65535KB (Java/Others) Su ...
随机推荐
- [Android分享] 彻底理解ldpi、mdpi、hdpi、xhdpi、xxhdpi
来自: http://www.eoeandroid.com/thread-565562-1-1.html?_dsign=42bed080 非常感谢楼主分享 这个问题我相信困惑了好多人包括很多老鸟,而且 ...
- flask mysql
sudo apt-get install mysql-servermysql -u root -p sudo apt-get install python-mysqldb sudo apt-get i ...
- Git error- fatal- Needed a single revision
最近在开发中由于项目结构的重构,有一部分代码被抽出来作为了公共库(git submodule),这样公共库可以独立维护,同时其他库调用它也是非常方便的,避免了到处复制代码的痛苦. 但我在项目重构后第一 ...
- 已安装好的tengine编译添加未被安装的模块
nginx -V 可以查看原来编译时都带了哪些参数 原来的参数: --prefix=/usr/local/tengine 需添加的参数: --with-http_stub_status_module ...
- Unity3D Quaternion各属性和函数测试
Quaternion属性与方法 一,属性: x.y.z就不说了,只看一个eulerAngles,代码如下: public Quaternion rotation = Quaternion.identi ...
- Mac开发者必备实用工具推荐
最近一个师兄给我推荐了一些Mac上的实用工具,用起来非常顺手,能提高不少开发效率.于是就想着把自己之前用过的其他工具也整理一下,一块推荐给大家,希望能对大家有帮助. Alfred 目前Mac下最好用的 ...
- POJ2442 Sequence
题目链接. #include <iostream> #include <cstdio> #include <cstring> #include <cstdli ...
- 更改Visual Studio 2010/2012/2008的主题设置
一.更改主题: 主题网站:http://studiostyl.es/ Visual Studio 2010发布也已经有一段时间了,不过安装后默认的白底的主题长时间看代码可能会感觉眼睛酸痛,况且时间长了 ...
- redis数据过期策略【转】
key的过期时间通常,Redis key被创建时不会自动关联过期时间,key将长久存在,除非通过DEL等命令显示的删除.EXPIRE命令簇可以为指定的key关联一个过期时间,代价是一点额外的内存开销. ...
- 【模拟】FOJ 2244 Daxia want to buy house
题目链接: http://acm.fzu.edu.cn/problem.php?pid=2244 题目大意: 每月还款额=贷款本金×[月利率×(1+月利率)^还款月数]÷[(1+月利率)^还款月数-1 ...