题目链接:传送门

题目大意:给你一个长度 N 的字符串,5<=N<=5,000,000,将首尾合并成环,断环成链并满足字典序最小,输出此时首字母在原串中的位置-1;

题目思路:最小表示法

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 100005
#define maxn 5000005
typedef pair<int,int> PII;
typedef long long LL; int n,m,cnt,S,T,k;
char ch[];
char str[maxn<<],str1[maxn<<]; int main(){
//freopen("in.txt","r",stdin);
int i,j,Case=,x,y;
scanf("%d",&n);
i=;
while(scanf("%s",str+i)!=EOF)i+=;
strcpy(str1,str);
strcat(str,str1);
i=,j=;
while(i<n&&j<n){
k=;
while(k<n&&str[i+k]==str[j+k])++k;
if(k==n)break;
if(str[i+k]>str[j+k])i+=k+;
else j+=k+;
if(j<=i)j=i+;
}
printf("%d\n",i);
return ;
}

最新文章

  1. Java Spring的IoC和AOP的知识点速记
  2. Java程序员必须熟知的十项技术
  3. react.js 公共方法 集合
  4. Unix操作系统中UUCP知识详细讲解
  5. 转 cocos2dx内存优化 (之二)
  6. 用通俗的例子解释OAuth和OpenID的区别【原】
  7. yarn源代码
  8. hdu 4925 贪心 自己从小到大做数据找方法规律
  9. 利用python深度学习算法来绘图
  10. .NET作品集:linux下的博客程序
  11. Time Complexity of Loop with Powers
  12. Sudoku 小项目
  13. JVM内存结构分析
  14. pyhon_day1 格式化输出
  15. Java学习——Applet菜单
  16. Linux/Python学习路线
  17. Uncaught TypeError: Illegal invocation
  18. Codeforces Round #501 (Div. 3) F. Bracket Substring
  19. Mac下用brew搭建PHP(LNMP/LAMP)开发环境
  20. 四、python之 if while for

热门文章

  1. Struts2中文件下载
  2. mac 使用apache开启https功能,实现ios局域网内测(一)
  3. 使用typescript开发js代码提升代码维护性
  4. CentOS6.6+Puppet3.7.4分布式部署Nagios监控系统
  5. Excel累加上一行的数值
  6. makefile之命令包&amp;多行变量
  7. ssh远程主机的免密登录配置
  8. js----Date\Math\数组对象
  9. Node.js 配置Nginx
  10. 如何Vue-cli开始使用在Vue.js项目中启动TDD(测试驱动开发)