HDU5442 Favorite Donut(KMP+最大表示法)
来源:互联网 发布:重庆seo网站推广 编辑:程序博客网 时间:2024/06/15 03:29
题意:给一个环,要找出里面的最大的串,输出串最大时起点的下标(从1开始)和顺时针(0)还是逆时针(1)。如果有多种情况就输出最小的下标,如果顺时针和逆时针相同就选择顺时针。
思路:正逆各用一次最大表示法即可。对于逆时针,因为要考虑字符串的循环对下标的影响,因此在与顺时针方向比较之前先做一次KMP,求出循环节长度。
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<vector>#include<map>#include<algorithm>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;const int mod = 1000000007;const int maxn = 20005;int MAXR(char s[], int l){for(int i=0; i<l; ++i){s[l + i] = s[i];}s[l * 2] = 0;int i = 0, j = 1;while(i < l && j < l){int k = 0;while(s[i + k] == s[j + k] && k < l){++k;}if(k == l) break;if(s[i + k] < s[j + k]) i = max(i + k + 1, j + 1);else j = max(j + k + 1, i + 1);}return i < j ? i : j;}void get_next(char s[], int next[]){ int len = strlen(s); next[0] = -1; int index; for(int i=1; i<len; ++i){ index = next[i - 1]; while(index >= 0 && s[i] != s[index + 1]){ index = next[index]; } if(s[i] == s[index + 1]){ next[i] = index + 1; } else { next[i] = -1; } }}char s1[maxn * 2], s2[maxn * 2];int nxt[maxn];int main(){ int len, t; scanf("%d", &t); while(t--){ scanf("%d", &len); scanf("%s", s1); for(int i=0; i<len; ++i){ s2[len - 1 - i] = s1[i]; s2[len] = 0; } get_next(s1, nxt); int k = len;//k是循环节长度 if(nxt[len - 1] > -1 && len % (len - 1 - nxt[len - 1]) == 0){ k = len - 1 -nxt[len - 1]; } int pos1 = MAXR(s1, len); int pos2 = MAXR(s2, len); s1[pos1 + len] = 0; s2[pos2 + len] = 0; if(strcmp(s1 + pos1, s2 + pos2) > 0){ printf("%d %d\n", pos1 + 1, 0); } else if(strcmp(s1 + pos1, s2 + pos2) < 0) { printf("%d %d\n", k - pos2, 1); } else { if((k - pos2) < (pos1 + 1)){ printf("%d %d\n", k - pos2, 1); } else { printf("%d %d\n", pos1 + 1, 0); } } }}
阅读全文
0 0
- hdu5442 Favorite Donut(最大表示法+KMP)
- HDU5442 Favorite Donut(KMP+最大表示法)
- hdu5442-字符串循环节&最小表示法|后缀数组(未补)|kmp+最小-Favorite Donut
- hdu 5442 Favorite Donut(最大表示法+kmp)
- hdu 5442 Favorite Donut(最大表示法+kmp)
- HDU 5442 Favorite Donut 最大最小表示法+KMP
- hdu 5442 Favorite Donut (最大表示法+KMP)
- HDU 5442 Favorite Donut 最大表示法+KMP
- hdoj 5442 Favorite Donut 【KMP最大表示法 后缀数组】
- [HDU 5443]Favorite Donut[KMP][最大表示]
- HDU 5442 Favorite Donut (最大表示法+KMP || 后缀数组)
- hdu 5442 Favorite Donut(最小表示法+kmp)
- hdu 5442 Favorite Donut(kmp+最小表示法)
- HDU 5442 Favorite Donut(最大表示法)
- HDU 5442 Favorite Donut(字符串最大表示法)
- 【HDU5442】 Favorite Donut(后缀数组)
- hdu5442 Favorite Donut
- hdu5442 最小最大表示法+kmp
- JQuery动画
- 二叉树遍历
- 企业级容器云平台EcOS-Newben更新至3.0版,全面支持主控节点的高可用
- 阿里云上部署tomcat启动后,通过http不能访问
- setInterval的函数有多个参数导致的失效问题
- HDU5442 Favorite Donut(KMP+最大表示法)
- 外派的这半年
- Qt程序打包发布方法(使用官方提供的windeployqt工具)
- 文章标题
- myBatis配置实现数据库字段下划线映射到java对象的驼峰式命名属性
- 自定义View (二)
- 【理论实践】new的三种用法:plain new,nothrow new和placement new
- linux 安装mysql数据库——yum安装法
- FileUpload文件上传源码解析