UVA 11584 Partitioning by Palindromes 划分回文串 (Manacher算法)
2015-08-13 11:21
531 查看
d[i]表示前面i个字符划分成的最小回文串个数,
转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1。
要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处理出来。(其实O(n^2)判断回文串的也可以,时间复杂度不会变,只是为了学习Manacher
Manacher最奇妙的地方在于用'#'把奇偶串的问题合并到了一起以及利用对称性快速计算P数组
转移:当第i字符加进来和前面区间j构成回文串,那么d[i] = d[j]+1。
要判断前面的字符j+1到i是不是回文串,可以用Manacher算法预处理出来。(其实O(n^2)判断回文串的也可以,时间复杂度不会变,只是为了学习Manacher
Manacher最奇妙的地方在于用'#'把奇偶串的问题合并到了一起以及利用对称性快速计算P数组
#include <iostream> #include <algorithm> #include <cstring> #include<cstdio> using namespace std; const int MAX = 1042; int len, p[2*MAX]; char str[MAX], newstr[2*MAX]; bool isPal[MAX][MAX]; void change() { int i; newstr[0] = '@'; newstr[1] = '#'; for (i = 0; i < len; i++){ newstr[2*i + 2] = str[i]; newstr[2*i + 3] = '#'; } newstr[2*len + 2] = '\0'; return ; } #define toPre(x) ((x-1)>>1) void Manacher() { int i, j, id, maxid = 0; len = 2 * len + 2; for (i = 0; i < len; i++){ if (maxid > i){ p[i] = min(p[2*id - i], maxid - i);//利用对称性快速计算p数组 } else{ p[i] = 1; } while (newstr[i+p[i]] == newstr[i-p[i]]) p[i]++; if (p[i] + i > maxid){ maxid = p[i] + i; id = i; } } for( i = 1; i < len; i++){ char pivot = newstr[i]; p[i]--; for(j = !(pivot<='z'&&pivot>='a'); j < p[i]; j+=2){ int u = toPre(i-j),v = toPre(i+j); isPal[u][v] = true; } } } int d[MAX]; int main() { //freopen("in.txt","r",stdin); int T; scanf("%d",&T); while (T--){ scanf("%s",str); len = strlen(str); change(); memset(isPal,0,sizeof(isPal)); Manacher(); len = (len-1)>>1; for(int i = 0; i < len; i++){ d[i] = isPal[0][i]?1:i+1; for(int j = 0; j < i; j++)if(isPal[j+1][i]){ d[i] = min(d[i],d[j]+1); } } printf("%d\n",d[len-1]); } // system("pause"); return 0; }
相关文章推荐
- Java DecimalFormat 用法
- 实际iOS编程中遇到的自定义导航栏按钮,导致手势返回失效的解决方法
- 在spring官网下载jar包、源码、文档
- Bit Manipulation - Number of 1 Bits
- SpringMVC表单标签(6)
- Android结合volley的netWorkImageview实现图片文件缓存
- 安装samba后在init.d文件夹没有smb
- 安装samba后在init.d文件夹没有smb
- remove '^M' in shell script
- c# winform 模拟web post图片
- uva 10139 求n的阶乘能否整除m
- Android FragmentManage FragmentTransaction介绍(一)
- rsync 文件同步
- 轻量级java ee 中的相关技术概述
- 为Elasticsearch添加中文分词,对比分词器效果
- group by与having的使用方法
- [转载]请教各位高手光盘版或者U盘版的BT保存配置的问题
- 前端页面中iOS版微信长按识别二维码的bug与解决方案
- 关于研究UIautomator操作手机执行case
- android RecyclerView 使用完全解析