题意:一个环形的字符串长度为n,求出长度n的字典序最大的子串,如果多个符合的子串,取顺时针起始字符下标最小的子串,如果从该起始字符的顺时针和逆时针得到结果相同,取顺时针的那个。

做法:这道题据说可以用后缀数组、后缀自动机之类的重型兵器解决,也可以用字符串的最大表示法加KMP这种相对轻量级的工具来解决。字符串的最大表示可以参考http://blog.csdn.net/zy691357966/article/details/39854359 (最大表示与最小表示的求法差别就是一个符号)。用字符串的最大表示法求出顺时针的最大的子串,然后将字符串倒过来,求一次最大表示,得到的字符串是在倒过来的情况下的最小下标的子串,但是如果在顺序的情况下想要得到最小下标的,需要得到逆序串的最大下标的子串,所以就需要用到kmp算法来解决这个问题。顺时针和逆时针的结果就很容易得到了,然后做一些比较就可以得到最终结果了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<climits>
#include<assert.h>
using namespace std;
const int maxn = 40005;
char str[maxn], rev[maxn];
char strret[20005], revret[20005];
int f[20005];
void linkStr(char *fir, char *sec)
{int len = strlen(fir);int len1 = strlen(sec);int ptr = len;for (int i = 0; i < len1; i++){fir[ptr++] = sec[i];}fir[ptr] = 0;
}void getFail(char *p,  int *f)
{int n = strlen(p);f[0] = 0;f[1] = 0;for (int i = 1; i < n; i++){int j = f[i];while (j&&p[i] != p[j]) j = f[j];f[i + 1] = p[i] == p[j] ? j + 1 : 0;}
}int findn(char *t, char *p, int *f)
{int ans;int n = strlen(t);int m = strlen(p);getFail(p, f);int j = 0;for (int i = 0; i < n; i++){while (j&&p[j] != t[i]) j = f[j];if (p[j] == t[i]) j++;if (j == m&&(i-m+1<=(n-1)/2)){ans=i-m+2;j=f[j];}}return ans;
}
void biggestRepresation(char *s, char *ret,int &ranking)//最大表示法
{int i, j, k, l;int n = strlen(s);linkStr(s, s);for (i = 0, j = 1; j < n;){for (k = 0; k < n&&s[i + k] == s[j + k]; k++);if (k >= n) break;if (s[i + k] > s[j + k])j += k + 1;else{l = i + k;i = j;j = max(l, j) + 1;}}ranking = i + 1;//paste to the retint ptr = i;for (int z = 0; z < n; z++){ret[z] = s[ptr++];}ret[n] = 0;
}void revstr(char *s, char *res)
{int len = strlen(s);int ptr = 0;for (int i = len - 1; i >= 0; i--){res[ptr++] = s[i];}res[ptr] = 0;
}int main()
{int T;scanf("%d", &T);while (T--){int len;scanf("%d", &len);if (len == 0) continue;scanf("%s", str);revstr(str, rev);int minn;int dir = 0;biggestRepresation(str, strret,minn);int _temp;biggestRepresation(rev,revret, _temp);_temp=findn(rev,revret,f);_temp=len-_temp+1;int cmp = strcmp(strret, revret);if (cmp<0||(cmp==0&&_temp < minn)) minn = _temp, dir = 1;printf("%d %d\n", minn, dir);}
}

HDU 5442 (串的最大表示+KMP)相关推荐

  1. 【考研】串的模式匹配算法——KMP算法(含真题)

    前言 本文内容源于对<数据结构(C语言版)>(第2版).王道讲解学习所得心得.笔记整理和总结,以便复习. 可搭配以下链接一起学习: [考研]<数据结构>知识点总结.pdf_考研 ...

  2. 最大表示法--环形字符串最大字典序(HDU 5442)

    http://acm.hdu.edu.cn/showproblem.php?pid=5442 问题概述:n个字符围成一个环,请从这个环中找出字典序最大的长度为n的字符串,输出它的起始点和方向(0顺1 ...

  3. 串的模式匹配、KMP算法、nextval数组求法

    一.暴力匹配 #include <iostream> using namespace std; #define MAXLEN 255 typedef struct{char ch[MAXL ...

  4. 数组与串,串的实现,KMP,BF算法

    数组是一种常用的数据结构,高级语言头提供了支持数组的基本操作,而且数组也是构成其他数据结构的重要组成. 数组是N个相同元素的构成的占用一块地址连续的内存单元的有限序列. 数组的任一个元素都可以用在数组 ...

  5. 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)

    题干: CC always becomes very depressed at the end of this month, he has checked his credit card yester ...

  6. 串的模式匹配(KMP算法)

    [问题描述] 串的模式匹配算法实现(KMP算法) [输入形式] 第一行输入主串s: 第二行输入模式串t: 第三行输入起始位置pos: [输出形式] 输出模式串t的next值(以空格分隔) 输出模式匹配 ...

  7. HDU 3336 Count the string(KMP+DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336 题意:给你一个字符串,计算其所有前缀在该字符串出现的次数的总和. 思路:next[j]=i,代表 ...

  8. HDU - 4300 Clairewd’s message(扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串 s 和 t ,字符串 s 代表着一种密码的映射,字符串 t 代表着一段密文+明文,题目保证密文是完整的,但明文只有一部分,现在问如何补全字符串 t ,使得 ...

  9. Oulipo HDU - 1686(哈希或KMP)匹配字符串

    题意:字符串匹配:寻找字符串S中,字符串T出现的次数 思路:KMP或哈希 The French author Georges Perec (1936–1982) once wrote a book, ...

  10. HDU 4125 Moles 笛卡尔树 + kmp

    题意:有n(1<=n<=600000)个鼹鼠挖洞,每个鼹鼠有给定权值,挖的洞是一颗二叉树(左边的鼹鼠权值都比当前鼹鼠小,右边的鼹鼠权值比当前鼹鼠大), 也要按照鼹鼠的出场顺序挖洞,在形成的 ...

最新文章

  1. Datawhale-零基础入门NLP-新闻文本分类Task01
  2. 利用软碟通软件制作Ubuntu16.04系统启动盘
  3. FPGA内部硬件结构简介
  4. BIEE11G系统数据源账号过期问题(默认安装步骤)
  5. Head First PHP MySQL(中文版)
  6. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第5节 线程池_2_线程池的代码实现...
  7. Java实现俄罗斯方块游戏(简单版)
  8. STM32 串口通讯及实现
  9. uni-app自动定位当前位置
  10. android 充电模式deamon_它是首款无线充电手机,也是雷军十年前的最爱|极客博物馆...
  11. WebSocket长连接因为网络波动而导致客户端的“假离线”---问题发现、分析到解决
  12. python白_Python小白到底有多白?
  13. 深入理解Linux电源管理(0.2)
  14. 鬼知道我昨晚经历了什么......
  15. Redis主从同步(复制)
  16. 【QGIS插件安装】buildseg: QGIS plugin for building extraction
  17. sql查询涵盖的时段_涵盖的主题
  18. python作业:学生成绩表数据包括:学号、姓名,高数、英语和计算机3门课成绩
  19. 【论文阅读】Attention 机制在脱机中文手写体文本行识别中的应用
  20. 2202年了,继续大比拼ViT、MLP、CNN结构有意义吗??

热门文章

  1. 高效能人士的七个习惯简介
  2. linux 平均负载 load average 的含义
  3. C++中如何读取一个数的位数_R语言入门之切尾均值(trimmed mean)和绝对中位差(mad)...
  4. 关于 MySQL bug 91418 一些看法
  5. tiny4412开发板Android篇_3基于tiny4412的Android系统的烧写(SD卡烧写到emmc)
  6. 项目Beta冲刺(3/7)(追光的人)(2019.5.25)
  7. [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))...
  8. 苹果恢复出厂设置系统也会还原吗_刷机、恢复出厂设置和还原设置,你还不知道有什么区别?...
  9. 淘宝客接入PHP(一)
  10. 动力节点『lol版』Java学习路线图(四)Javaweb阶段