ZCMU-1550-AA
2017-01-11 09:36
211 查看
1550: AA
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 88 Solved: 26
[Submit][Status][Web
Board]
Description
其实第一次听说要出题目我是拒绝的,因为,你不能让我出,我就马上去出,我要试一下,因为我不愿意出完了以后再加一些案例上去,然后题目duang的一下就被AC了。现在要求对字符串进行环状左移操作,每次向左移动一个位置。例如:对duang进行操作,得到的全部字符串为:duang
uangd
angdu
ngdua
gduan
输出得到最小字典序的字符串的最小移动次数。
Input
输入一个数T(1<=T<=100),表示接下来有T行字符串;输入字符串S,S的长度为L(5<=l<=100000)。Output
输出一个数字,表示为得到最小字典序的字符串的最小移动次数。Sample Input
2baabaa
alabala
Sample Output
16
【解析】
这道题我提交了好多次都是超时...但是呢我觉得做题目嘛主要是学东西..我是用map,结构体还有用刘汝佳老师书上的方法也试了一下还是超时...此处附上我的超时代码...其实有的时候我们不能真的为了AC而去AC。还可以直接比较..还有就是当我们用map<string,int>的时候是按照string的最小字典序来排列的所以我们也可以用map
#include<cstdio> #include<algorithm> #include<iostream> #include<map> #include<cstring> using namespace std; struct E { string zi;//结构体存储 int b; }; bool cmp(E a,E b) { return (a.zi).compare(b.zi)<0;//两个字符串进行比较,字典序小的排在前面 } int main() { int t,n,i,j,k,p; string s,s1; scanf("%d",&t); while(t--) { p=0; E f[100010]; cin>>s; f[p].zi=s; f[p].b=0; n=s.size(); for(i=1;i<=n;i++) { string s1; for(j=i;j<n;j++) { s1+=s[j]; } for(k=0;k<i;k++) { s1=s1+s[k];//获取移动的字符串 } p++; f[p].zi=s1; f[p].b=i; } sort(f,f+p,cmp);//根据字典序来排序 cout<<f[0].b<<endl; } return 0; }
#include<cstdio> #include<algorithm> #include<iostream> #include<map> #include<cstring> using namespace std; int main() { int t,n,i,k; string s,s1,s3; scanf("%d",&t); while(t--) { cin>>s; s3=s; k=0; n=s.size(); for(i=1;i<=n;i++) { string s1,s2; s1=s.substr(i,n-i); s2=s.substr(0,i); s1=s1+s2; if(s3.compare(s1)>0)//此函数用来比较字典序 { s3=s1; k=i; } } printf("%d\n",k); } return 0; }
#include<cstdio> #include<algorithm> #include<iostream> #include<map> #include<cstring> using namespace std; map<string,int>a; int main() { int t,n,i; string s,s1; scanf("%d",&t); while(t--) { a.clear(); cin>>s; a[s]=0; n=s.size(); for(i=1;i<=n;i++) { string s1,s2; s1=s.substr(i,n-i); s2=s.substr(0,i);//获取字符串从0开始取i个 s1=s1+s2; if(a[s1]==0) a[s1]=i; } map<string,int>::iterator it=a.begin();//map<string,int>是按照最小字典序来排列的 cout<<it->second<<endl; } return 0; }
#include<stdio.h> #include<string.h> #define maxn 100010 int less(char s[],int p,int q) { int n=strlen(s); int i; for(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 main() { int t,ans,n,i; char s[maxn]; scanf("%d",&t); while(t--) { scanf("%s",s); ans=0; n=strlen(s); for(i=1;i<n;i++) { if(less(s,i,ans)) ans=i; } printf("%d\n",ans); } return 0; }
相关文章推荐
- asfdsaffdaaaaaaaaaaaaa
- aa
- aa
- aa
- aaaaaaaaaa
- AS3里var aa:String是null还是""?
- Biztalk 2009在Windows 2008 R2环境中的High Availability(Cluster群集)部署(下)--AA模式
- 求S=a+aa+aaa+....+aa...aaa之值,其中a是1~9之间的数字。
- 关于不能从UM AA转移呼叫到LYNC的问题
- 松下著名的4 dac技术+class AA放大器技术。technics_su-v90d
- aa
- 使用Render To Texture的AA问题
- aaaaaaaaaaaaaa
- 给定a和n,计算a+aa+aaa+a...a(n个a)的和(大数据处理)
- 求s=a+aa+aaa+aaaa+aa...a的值
- <marquee>aa</marquee>实现内容滚动时首尾相连,不出现空白的时候
- APUE之怎么将AA:BB:CC:DD:EE:FFZ转换成0xAA 0xBB.......(sscanf运用)
- aaaaaaaaaaaaaaaaaaa
- 输入a和n,求Sn=a+aa+aaa+……+aa……a(n个)的值
- 25-输入数字和个数计算sn=a+aa+..