题意:

给出一个字符串,只由‘a’~‘z'组成,字符串是一个首尾相接的串。我们要找到一个起点,顺时针或者逆时针的读这个串,找到字典序最大的读法,如果有多种,输出起点坐标小的那个,如果起点坐标一样,输出顺时针的那个。

思路:

把串变成倍长的,反着再处理一次。

坑死我了。。。用罗穗骞的da算法超时,用dc3RE,用了个网上找的,过了。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <set>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll;
const int N=1e5;
int sa[N],height[N],Rank[N],tmp[N],top[N];
char s[N];
void dc3(int n){int i,j,len,na;na=(n<256?256:n);memset(top,0,na*sizeof(int));for(i=0;i<n;i++)top[Rank[i]=s[i]&0xff]++;for(i=1;i<na;i++)top[i]+=top[i-1];for(i=0;i<n;i++)sa[--top[Rank[i]]]=i;for(len=1;len<n;len<<=1){for(i=0;i<n;i++){j=sa[i]-len;if(j<0)j+=n;tmp[top[Rank[j]]++]=j;}sa[tmp[top[0]=0]]=j=0;for(i=1;i<n;i++){if(Rank[tmp[i]]!=Rank[tmp[i-1]]||Rank[tmp[i]+len]!=Rank[tmp[i-1]+len])top[++j]=i;sa[tmp[i]]=j;}memcpy(Rank,sa,n*sizeof(int));memcpy(sa,tmp,n*sizeof(int));if(j>=n-1)break;}
}char rt[N];void _print(int ans1,int ans2,int n)
{int t1=ans1;int t2=ans2;t2+=n;for(int i=0;i<n;i++){if(rt[t1]>rt[t2]){printf("%d 0\n",ans1+1);return ;}if(rt[t1]<rt[t2])    {printf("%d 1\n",ans2+1);return ;}t1++;if(t1>n+n)break;t2--;if(t2<0)break;}if(ans1<ans2)printf("%d 0\n",ans1+1);else if(ans2<ans1)printf("%d 1\n",ans2+1);elseprintf("%d 0\n",ans1+1);
}int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);scanf("%s",s);for(int i=0;i<n;i++){s[i+n]=s[i];rt[i]=rt[i+n]=s[i];}s[n+n]=0;dc3(n+n+1);
//        for(int i=0;i<n+n;i++)
//            printf("1--%d\n",Rank[i]);int ans1=0;for(int i=1;i<n;i++){if(Rank[i]>Rank[ans1])ans1=i;}for(int i=0;i<n;i++){s[i]=rt[n-i-1];s[i+n]=rt[n-i-1];}s[n+n]='z'+1;dc3(n+n+1);int ans2=0;for(int i=1;i<n;i++){if(Rank[i]>Rank[ans2])ans2=i;}ans2=n-1-ans2;_print(ans1,ans2,n);
//        printf("%d %d\n",ans1,ans2);
//        for(int i=0;i<n+n;i++)
//            printf("2--%d\n",Rank[i]);}return 0;
}

附上TLE的da算法代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;#define maxn 20005
int wa[maxn],wb[maxn],wv[maxn],_ws[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
void da(char *r,int *sa,int n,int m)
{int i,j,p,*x=wa,*y=wb,*t;for(i=0;i<m;i++) _ws[i]=0;for(i=0;i<n;i++) _ws[x[i]=r[i]]++;for(i=1;i<m;i++) _ws[i]+=_ws[i-1];for(i=n-1;i>=0;i--) sa[--_ws[x[i]]]=i;for(j=1,p=1;p<n;j*=2,m=p){for(p=0,i=n-j;i<n;i++) y[p++]=i;for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<n;i++) wv[i]=x[y[i]];for(i=0;i<m;i++) _ws[i]=0;for(i=0;i<n;i++) _ws[wv[i]]++;for(i=1;i<m;i++) _ws[i]+=_ws[i-1];for(i=n-1;i>=0;i--) sa[--_ws[wv[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}return;
}
int _rank[maxn],_height[maxn];
void cal_height(char *r,int *sa,int n)
{int i,j,k=0;for(i=1;i<=n;i++) _rank[sa[i]]=i;for(i=0;i<n;_height[_rank[i++]]=k)for(k?k--:0,j=sa[_rank[i]-1];r[i+k]==r[j+k];k++);return;
}char r[maxn],rt[maxn];
int sa[maxn];void _print(int ans1,int ans2,int n)
{int t1=ans1;int t2=ans2;t2+=n;for(int i=0;i<n;i++){if(rt[t1]>rt[t2]){printf("%d 0\n",ans1+1);return ;}if(rt[t1]<rt[t2])    {printf("%d 1\n",ans2+1);return ;}t1++;t2--;}if(ans1<ans2)printf("%d 0\n",ans1+1);else if(ans2<ans1)printf("%d 1\n",ans2+1);elseprintf("%d 0\n",ans1+1);
}int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);scanf("%s",r);for(int i=0;i<n;i++){r[i+n]=r[i];rt[i]=rt[i+n]=r[i];}r[n+n]=0;da(r,sa,n+n+1,200);cal_height(r,sa,n+n);
//        for(int i=0;i<n+n;i++)
//            printf("1--%d\n",_rank[i]);int ans1=0;for(int i=1;i<n;i++){if(_rank[i]>_rank[ans1])ans1=i;}for(int i=0;i<n;i++){r[i]=rt[n-i-1];r[i+n]=rt[n-i-1];}r[n+n]='z'+1;da(r,sa,n+n+1,200);cal_height(r,sa,n+n);int ans2=0;for(int i=1;i<n;i++){if(_rank[i]>_rank[ans2])ans2=i;}ans2=n-1-ans2;_print(ans1,ans2,n);
//        printf("%d %d\n",ans1,ans2);
//        for(int i=0;i<n+n;i++)
//            printf("2--%d\n",_rank[i]);}return 0;
}

附上RE的dc3算法代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;#define maxn 1000003#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)
int wa[maxn],wb[maxn],wv[maxn],_ws[maxn];
int c0(char *r,int a,int b)
{return r[a]==r[b]&&r[a+1]==r[b+1]&&r[a+2]==r[b+2];
}
int c12(int k,char *r,int a,int b)
{if(k==2) return r[a]<r[b] || r[a]==r[b] && c12(1,r,a+1,b+1);else return r[a]<r[b] || r[a]==r[b] && wv[a+1]<wv[b+1];
}void sort(char *r,int *a,int *b,int n,int m)
{int i;for(i=0;i<n;i++) wv[i]=r[a[i]];for(i=0;i<m;i++) _ws[i]=0;for(i=0;i<n;i++) _ws[wv[i]]++;for(i=1;i<m;i++) _ws[i]+=_ws[i-1];for(i=n-1;i>=0;i--) b[--_ws[wv[i]]]=a[i];return;
}
void dc3(char *r,int *sa,int n,int m)
{int i,j,*san=sa+n,ta=0,tb=(n+1)/3,tbc=0,p;char *rn=r+n;r[n]=r[n+1]=0;for(i=0;i<n;i++) if(i%3!=0) wa[tbc++]=i;sort(r+2,wa,wb,tbc,m);sort(r+1,wb,wa,tbc,m);sort(r,wa,wb,tbc,m);for(p=1,rn[F(wb[0])]=0,i=1;i<tbc;i++)rn[F(wb[i])]=c0(r,wb[i-1],wb[i])?p-1:p++;if(p<tbc) dc3(rn,san,tbc,p);else for(i=0;i<tbc;i++) san[rn[i]]=i;for(i=0;i<tbc;i++) if(san[i]<tb) wb[ta++]=san[i]*3;if(n%3==1) wb[ta++]=n-1;sort(r,wb,wa,ta,m);for(i=0;i<tbc;i++) wv[wb[i]=G(san[i])]=i;for(i=0,j=0,p=0;i<ta && j<tbc;p++)sa[p]=c12(wb[j]%3,r,wa[i],wb[j])?wa[i++]:wb[j++];for(;i<ta;p++) sa[p]=wa[i++];for(;j<tbc;p++) sa[p]=wb[j++];return;
}int _rank[maxn],_height[maxn];
void cal_height(char *r,int *sa,int n)
{int i;for(i=1;i<=n;i++) _rank[sa[i]]=i;return;
}char r[maxn],rt[maxn];
int sa[maxn];void _print(int ans1,int ans2,int n)
{int t1=ans1;int t2=ans2;t2+=n;for(int i=0;i<n;i++){if(rt[t1]>rt[t2]){printf("%d 0\n",ans1+1);return ;}if(rt[t1]<rt[t2])    {printf("%d 1\n",ans2+1);return ;}t1++;t2--;}if(ans1<ans2)printf("%d 0\n",ans1+1);else if(ans2<ans1)printf("%d 1\n",ans2+1);elseprintf("%d 0\n",ans1+1);
}int main()
{int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);scanf("%s",r);for(int i=0;i<n;i++){r[i+n]=r[i];rt[i]=rt[i+n]=r[i];}r[n+n]=0;dc3(r,sa,n+n+1,200);cal_height(r,sa,n+n);
//        for(int i=0;i<n+n;i++)
//            printf("1--%d\n",_rank[i]);int ans1=0;for(int i=1;i<n;i++){if(_rank[i]>_rank[ans1])ans1=i;}for(int i=0;i<n;i++){r[i]=rt[n-i-1];r[i+n]=rt[n-i-1];}r[n+n]='z'+1;dc3(r,sa,n+n+1,200);cal_height(r,sa,n+n);int ans2=0;for(int i=1;i<n;i++){if(_rank[i]>_rank[ans2])ans2=i;}ans2=n-1-ans2;_print(ans1,ans2,n);
//        printf("%d %d\n",ans1,ans2);
//        for(int i=0;i<n+n;i++)
//            printf("2--%d\n",_rank[i]);}return 0;
}

hdu5442(2015长春网络赛F题)相关推荐

  1. hdu5455(2015沈阳网络赛F题)

    题意: 给出一个串,问用题中定义的那些串来组成这个串最少要用多少个. 思路: 没啥说的,注意一下输入的串中可能出现除了c和f的字母. 代码: #include<cstdio> #inclu ...

  2. hdu5489(2015合肥网络赛F题)

    转载自:http://blog.csdn.net/lwt36/article/details/48774103 题意: 给出一个数列,在其中删除连续的L个数字,使得剩余的数字LIS最大,输出此LIS. ...

  3. hdu5446(2015长春网络赛J题)

    题意: 求C(n,m)%(p1*p2*......pk),其中,p1*p2*......pk都是素数. 思路: 不会...数论是渣,赛后知道是Lucas定理+中国剩余定理. 代码: #include& ...

  4. hdu5441(2015长春网络赛E题)

    题意: 给出一个n个点.m条边的无向图,边上有权值,有q组询问,每组询问给出一个数字x,我们要在图中找出'点对'的个数,这些'点对'(例如a,b)满足从a到b有一条路径经过的每一条边都要小于x,输出每 ...

  5. hdu5444(2015长春网络赛H题)

    题意: 给出一棵树的描述,这棵树构造出来,满足从右到左数值递增,根在最下面,然后有一些询问x,我们要输出从根走到x的路径,w:向左.e:向右. 思路: 建树的时候,首先第一个点一定是根,然后比根小的建 ...

  6. hdu5443(2015长春网络赛G题)

    题意: 一个数列,求从L到R的最大值. 思路: 不多说... 代码: #include<cstdio> #include<cstring>int a[20000];int ma ...

  7. hdu5438(2015长春网络赛B题)

    题意: 有n个池塘.m个管道,每个池塘有权值,m个管道用来连接池塘(无向边),我们要把度小于2的池塘删除,统计每个包含池塘数是奇数的连通分量的权值并输出. 思路: 拓扑排序之后,删点,然后dfs一遍就 ...

  8. hdu5437(2015长春网络赛A题)

    题意: 有一个party,会有n个人来,每个人都带着礼物来,礼物有权值,由于屋子的大小有限,所以他会选择k个时间来开门,在t时间让p个人进来,接下来有q组询问,每组询问有一个数字ni,让你输出第ni个 ...

  9. 2017acm乌鲁木齐赛区网络赛F题tarjan缩点

    poj1236是问把一棵树变成强联通分量,于是答案就是rudu为0的和出度为0的最大值,因为假设入度为0的多一些,先每个出度为0的连接一个入度为0的,那么还剩一些入度为0的,这时候入度为0的随意连接一 ...

最新文章

  1. 思考Web应用的数据流
  2. Win7硬盘安装方法
  3. [html] 怎样在页面上实现一个圆形的可点击区域?
  4. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...
  5. 12306 抢票项目霸榜 GitHub,标星即将破万
  6. 【英语学习】【Level 08】U02 Movie Time L2 In black and white
  7. java1.8移除apt,java 1.8上的maven-enunciate-plugin现在从最新的JDK中删除了(即java注释处理工具)...
  8. json decode php 二维,在json_decode /多维数组之后访问JSON数组
  9. 提取MapInfo地图数据中的空间数据解决方案
  10. Mysql最常用的十大函数
  11. python输出为指定编码_Python 中文编码
  12. Axure RP8.0仿制知乎页面(更新1-菜鸟级)
  13. 服务器的分类都有哪几种?
  14. ppt流程图箭头分叉_职场PPT实战:流程图只能箭头方框?设计师教你新思路
  15. dnf超时空漩涡副本路线流程图_DNF超时空漩涡怎么打
  16. 星际迷航-发现号-第三季最后一集
  17. 利用python爬取工商银行黄金价格
  18. 曹鹏 其言其人 2009-06-15 17:44
  19. 使用中国气象局的天气预报webservice
  20. linux操作系统 以下哪个命令,Linux认证考试基础试题及答案

热门文章

  1. [OS复习]进程互斥与同步2
  2. 关于iis部署的一些小问题
  3. 编写好代码的10条戒律
  4. UpdatePanel中用后台调用Javascript
  5. ASP.NET应用程序设计的10大技巧
  6. STM32-中断优先级
  7. 【论文笔记】李盟, et al. 一种恶意代码特征选取和建模方法. 计算机应用与软件 08(2015):272-277.
  8. Easyexcel文件下载时,中文名称显示为下划线
  9. 数据库连接池技术--BoneCP
  10. 日常生活小技巧 -- 重装win10系统