HDU
来源:互联网 发布:阿里云app名师课堂在哪 编辑:程序博客网 时间:2024/06/10 08:23
题目链接: HUD-3374
题目大意:
给你一个字符串,问这个字符串经过移动后的字典序最小的字符串的首字符位置和字典序最大的字符串的首字符的位置,和能出现多少次最小字典序的字符串和最大字典序的字符串
解题思路:
能出现多少次,就要看循环节有多少个了 !!
剩下的就是最小表示法和最大表示法的裸题了!!
最大表示法和最小表示法详解:最大表示法和最小表示法
对了!还有就是char数组千万不要用cin输入,这样时间会大大增加!!
#include<bits/stdc++.h>using namespace std;const int MAX_N = 1e6+9;char str[MAX_N];int nxt[MAX_N];void make_next(char * str){ int len = strlen(str); memset(nxt,0,sizeof(nxt)); nxt[0] = 0; for(int i=1,k=0;i<len;i++) { while(k>0 && str[k] != str[i]) { k = nxt[k-1]; } if(str[k] == str[i]) k++; nxt[i] = k; }}int getMin(char * str){ int len = strlen(str); int i=0,j=1; int k=0; while(i<len && j<len) { int t = str[(i+k)%len] - str[(j+k)%len]; if(!t) k++; else { if(t>0) { if(i+k+1 > j) i = i+k+1; else i = j+1; } else if(j+k+1 > i) j = j+k+1; else j = i+1; k=0; } if(k>=len) break; } return i<j?i:j;}int getMax(char * str){ int len = strlen(str); int i =0,j=1; int k=0; while(i<len && j<len) { int t = str[(i+k)%len] - str[(j+k)%len]; if(!t) k++; else { if(t<0) { if(i+k+1 > j) i = i+k+1; else i = j+1; } else if(j+k+1 > i) j = j+k+1; else j = i+1; k=0; } if(k>=len)break; } return i<j?i:j;}int main(){ while(~scanf("%s",str)) { make_next(str); int len = strlen(str); int cir = len - nxt[len-1]; int num = len / cir; cout<<getMin(str)+1<<" "<<num<<" "<<getMax(str)+1<<" "<<num<<endl; }}
阅读全文
0 0
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- hdu-
- hdu
- hdu
- hdu
- HDU
- 关于APP进程被杀死,极光推送收不到消息的解决办法
- 12.11笔记
- 30天了解30种技术系列---(16)可视化爬虫工具---Portia
- CLASS
- 多年不见,csdn也改版了
- HDU
- 30天了解30种技术系列(17)---词关系分析神器Word2vec
- netty源码分析之服务端启动全解析
- 【Java学习笔记】如何定义Java中的不可变类
- 乐逛0.1
- 1012. The Best Rank (25)
- day3
- Verilog HDL语言的使用
- 30天了解30种技术系列---(13)Docker UI框架DockerUI