一开始没太看懂什么意思,拿笔反复推了一遍才大概知道最大最小表示法是怎么求的,感觉太神奇了... #include <iostream> #include <cstdio> #include <string.h> #pragma warning ( disable : 4996 ) using namespace std; inline int Max(int a,int b) { return a>b?a:b; } inline int Min(int a,int…
最小标示法:给定一个字符串,不断将其最后一个字符放到开头,最终会得到n个字符串,称这n个字符串循环同构,这些字符串中字典序最小的一个,就是最小表示法 #include<iostream> #include<cstring> #include<cstdio> using namespace std; #define maxn 1000005 int len; int main(){ int t; cin>>t; while(t--){ ]={}; cin>…
HDU 4162 题意: 给一个数字串(length <= 300,000),数字由0~7构成,求出一阶差分码,然后输出与该差分码循环同构的最小字典序差分码. 思路: 第一步是将差分码求出:s[i] = (s[i] - s[i+1] + 8) % 8; 第二步是求出最小字典序的循环同构差分码,我之前没注意到字符串规模. .直接用set做,MLE+TLE... 正确的方式应该是一种O(n)的解法.即最小表示法. //关于最小表示法的证明与详述请參考最小表示法:) 最小表示法算法: 初始时,i=0,…
题意:给你一个字符串,这个字符串我们可以把把他变成n个字符串按照以下规则:将当前字符串第一个放到字符串最后一位,字符串的下标依次向前推一位,比如:s[1] s[2 ]s[3] s[4]->s[2 ]s[3] s[4] s[1]...,然后问你字典序最小的和字典序最大的字符串在这n个字符串中的位置 解题思路:首先判定是否是循环串,然后用最小表示法和最大表示法来找出对应的位置,最小表示法可以找出比如一个环形的字符串,找出某个字符开始,然后这个字符串字典序最小: 代码: #include<iostr…
How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1852    Accepted Submission(s): 763 Problem Description Give you n ( n < 10000) necklaces ,the length of necklace will not large than 10…
最小表示法就是一个字符串构成一个环,找以哪个点为开头字典序最小. 然后我们就可以用n2的算法愉快的做啦~实际上有O(n)的做法的,就是用两个指针扫,如果这两个位置的字典序相等,就一起往后,如果某一个大,就把那个指针指到大的那个的后面. 每次至少有一个指针往后移一个,复杂度就是线性的了. (自己YY的,求不出锅) #include <iostream> #include <cstdio> #include <cstring> using namespace std; in…
*N]; //储存临时串 *N];//中间记录 int Manacher(char tmp[]) { int len=strlen(tmp); ; ;i<len;i++) { s[cnt++]='#'; s[cnt++]=tmp[i]; } s[cnt++]='#'; memset(save,,sizeof(save)); ,p=; ; ;i<cnt-;i++) { if(i>=p) { ; &&s[i+num]==s[i-num]) { num++; } p=i+num…
https://konnyakuxzy.github.io/BZPRO/JudgeOnline/2740.html 题解讲的很清楚了 (好像等于的情况应该归入case2而不是case1?并不确定) 具体方法: 将串翻转,找到字典序最小且最短的后缀,然后找到以这个后缀为纯循环节的最长后缀T,则第一步是将这个后缀T提到最前面: 然后第二步是把整个串除T外部分变为其循环同构串的最小表示. 要找到字典序最小且最短的后缀,只要找到整个串的最小表示法(设最小表示法在位置i开始),然后找到S[i..n]的最短…
洛谷题目传送门 最小表示是指一个字符串通过循环位移变换(第一个移到最后一个)所能得到的字典序最小的字符串. 因为是环状的,所以肯定要先转化为序列,把原串倍长. 设决策点为一个表示法的开头.比较两个决策点\(i,j\),找到它们的LCP(假设长度为\(k\)). 假设\(s_{i+k}>s_{j+k}\),那么显然决策\(s_{i...i+k}\)是分别不优于决策\(s_{j...j+k}\)的,直接跳过这一部分即可.\(s_{i+k}<s_{j+k}\)同理. 时间复杂度\(O(n)\). #…
题意 找到一个字符串中最先出现的最小(大)表示位置,和最小(大)表示串出现次数 分析 用最小(大)表示法求出最先出现的最小(大)表示位置,然后将串长扩两倍用exkmp找出现次数. Code #include<bits/stdc++.h> #define fi first #define se second #define lson l,mid,p<<1 #define rson mid+1,r,p<<1|1 #define pb push_back #define ll…