HDU 4162 Shape Number (模拟)
2016-05-17 19:55
459 查看
题意:给一个字符串,字符串中的0看作8,然后后一位减去前一位并提前一位,第一位减去最后一位放在最后一位,然后求求得字符串的最小字典序
把紫书上的方法抄下来交上去超时,后来看题解找了一个方法(没注释的)才AC的
代码如下
把紫书上的方法抄下来交上去超时,后来看题解找了一个方法(没注释的)才AC的
代码如下
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> #include<iostream> using namespace std; const int maxn=300000+10; char a[maxn]; char b[maxn]; //int lesss(const char *s,int p,int q,int n) //{ // for(int i=0; i<n; i++) // if(s[(p+i)%n]!=s[(q+i)%n]) // return s[(p+i)%n]<s[(q+i)%n]; // return 0; //} int work(int m) { int i,j,l; i=0; j=1; while(i<m && j<m) { for(l=0;l<m;l++) if(b[(i+l)%m]!=b[(j+l)%m]) break; if(l>m) break; if(b[(i+l)%m] > b[(j+l)%m]) i=i+l+1; else j=j+l+1; if(i==j) j=i+1; } if(i<j) return i; return j; } int main() { while(~scanf("%s",a)) { int len=strlen(a); for(int i=0; i<len; i++) { if(a[i]=='0') a[i]='8'; if(a[i+1]=='0') a[i+1]='8'; if(i<len-1) b[i]=(8+(a[i+1]-a[i]))%8+'0'; else b[i]=(8+(a[0]-a[i]))%8+'0'; } int ans=work(len); // int n=strlen(a); // for(int i=1; i<len; i++) // if(lesss(b,i,ans,len)) ans=i; for(int i=0; i<len; i++) putchar(b[(i+ans)%len]); printf("\n"); } }
相关文章推荐
- 【白书之路】1584 - Circular Sequence 最小字典序
- 2016SDAU编程练习三1023
- 定义圆类Circle,数据成员有半径radius,成员函数有默认构造函数(默认半径为10)、构造函数、计算圆面积、圆周长以及输出函数,分别构造默认对象和半径为15的对象,输出各对象的周长与面积。
- SQL慢查询优化
- linux下生成core dump文件方法及设置
- 为RecyclerView打造通用Adapter 让RecyclerView更加好用
- 上楼梯
- SICP 2-31 2-32 SymbolicDiffer
- python学习笔记,长期记录不会的知识
- win10 explorer导致闪屏的解决方案
- [bzoj 1617]: [Usaco2008 Mar]River Crossing渡河问题 dp
- 乘法逆元与费马小定理
- [BZOJ1002][FJOI2007]轮状病毒(打表找规律+高精度||结论)
- 【bzoj1618】【Usaco2008 Nov]】Buying Hay 购买干草
- RIP、OSPF、BGP三种协议
- Ubuntu下Chrome造成系统假死的解决方法
- Docker 学习日志 (二)
- BZOJ -1864: [Zjoi2006]三色二叉树
- 算是学完了《Servlet&JSP学习笔记》,立此存照
- IOS学习之初识KVO