博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串最大最小表示法模板 ( 字典序最大最小 )
阅读量:5159 次
发布时间:2019-06-13

本文共 3219 字,大约阅读时间需要 10 分钟。

模板

int getMin(char *s)  {      int i = 0, j = 1, l;      int len = strlen(s);      while(i < len && j < len)      {          for(l = 0; l < len; l++)              if(s[(i + l) % len] != s[(j + l) % len]) break;          if(l >= len) break;          if(s[(i + l) % len] > s[(j + l) % len])          {              if(i + l + 1 > j) i = i + l + 1;              else i = j + 1;          }          else if(j + l + 1 > i) j = j + l + 1;          else j = i + 1;      }      return i < j ? i : j;  }    int getMax(char *s)  {      int len = strlen(s);      int i = 0, j = 1, k = 0;      while(i < len && j < len && k < len)      {          int t = s[(i+k)%len]-s[(j+k)%len];          if(!t) k++;          else          {              if(t > 0)              {                  if(j+k+1 > i) j = j+k+1;                  else j = i+1;              }              else if(i+k+1 > j) i = i+k+1;              else i = j+1;              k = 0;          }      }      return i < j ? i : j;  }
View Code

 

问题提出 : 给出一个字符串求出字符串的最大or最小表示法

 

分析 : 参考==>

一般来说就是能够解决字面意思的题意以及一些字符串同构问题

 

相关题目 :

题意 : 给出 n 个字符串,问你有多少不同的字符串,其中同构的字符串算作一种

分析 : 用最大or最小表示法将所有字符串“同化”然后装到set容器判重

#include
#include
#include
#include
#include
#include
using namespace std;int len;int getMin(string & s){ int i = 0, j = 1, l; while(i < len && j < len) { for(l = 0; l < len; l++) if(s[(i + l) % len] != s[(j + l) % len]) break; if(l >= len) break; if(s[(i + l) % len] > s[(j + l) % len]){ if(i + l + 1 > j) i = i + l + 1; else i = j + 1; } else if(j + l + 1 > i) j = j + l + 1; else j = i + 1; } return i < j ? i : j;}int main(void){ int n; string s, into; while(~scanf("%d", &n)){ set
cnt; for(int i=0; i
>s; len = s.length(); int idx = getMin(s); into.clear(); for(int j=0; j
View Code

 

题意 : 给出一个字符串,叫你给出要构成最大or最小表示法字符串开头应该在的位置,然后就是计算一下这个表示法下字符串循环节出现次数

分析 : KMP + 最大最小模板即可解决

#include
#include
using namespace std;const int maxn = 1e6 + 10;char mo[maxn], s[maxn];int Next[maxn], moL, len;int getMax(){ int i = 0, j = 1, k = 0; while(i < len && j < len && k < len) { int t = s[(i+k)%len]-s[(j+k)%len]; if(!t) k++; else { if(t > 0) { if(j+k+1 > i) j = j+k+1; else j = i+1; } else if(i+k+1 > j) i = i+k+1; else i = j+1; k = 0; } } return i < j ? i : j;}int getMin(){ int i = 0, j = 1, l; while(i < len && j < len) { for(l = 0; l < len; l++) if(s[(i + l) % len] != s[(j + l) % len]) break; if(l >= len) break; if(s[(i + l) % len] > s[(j + l) % len]){ if(i + l + 1 > j) i = i + l + 1; else i = j + 1; } else if(j + l + 1 > i) j = j + l + 1; else j = i + 1; } return i < j ? i : j;}inline void GetNext(){ int i = 0, j = -1; Next[i] = j; while(i < moL){ while(j!=-1 && mo[i]!=mo[j]) j = Next[j]; Next[++i] = ++j; }}inline void PrintAns(){ int idx = getMin(); for(int i=0; i
View Code

 

转载于:https://www.cnblogs.com/LiHior/p/7598312.html

你可能感兴趣的文章
css3 2d转换3d转换以及动画的知识点汇总
查看>>
【Java】使用Eclipse进行远程调试,Linux下开启远程调试
查看>>
对Vue为什么不支持IE8的解释之一
查看>>
计算机改名导致数据库链接的诡异问题
查看>>
Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)
查看>>
ObjectiveC基础教程(第2版)
查看>>
centos 引导盘
查看>>
Notes of Daily Scrum Meeting(12.8)
查看>>
Apriori算法
查看>>
onlevelwasloaded的调用时机
查看>>
求出斐波那契数组
查看>>
lr_start_transaction/lr_end_transaction事物组合
查看>>
CodeIgniter学习笔记(四)——CI超级对象中的load装载器
查看>>
.NET CLR基本术语
查看>>
ubuntu的home目录下,Desktop等目录消失不见
查看>>
建立,查询二叉树 hdu 5444
查看>>
[Spring框架]Spring 事务管理基础入门总结.
查看>>
2017.3.24上午
查看>>
Python-常用模块及简单的案列
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>