Problem F. Matrix Game XVII Open Cup named after E.V. Pankratiev||字符串最大表示法

来源:互联网 发布:移动网络优化设置 编辑:程序博客网 时间:2024/06/11 21:04

题目:


模板题,最大表示法,对字符串预处理一下就好了。

AC代码:

/*2017年8月30日10:41:29Problem F. Matrix Game字符串的最大表示法 直接用模板 AC*/#include <iostream>#include <map>#include <set>#include <string>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <queue>#include <vector> using namespace std;const int maxn=110;string a[maxn],b[maxn],ans;int n,m;bool cmp(const string &a,const string &b){return a>b;}int get_max(string s)//最大表示法{    int len=s.size();    int i=0,j=1,k=0;    while(i<len&&j<len)    {        k=0;        while(s[(i+k)%len]==s[(j+k)%len]&&k<len)            k++;            if(k>=len) break;        if(s[(i+k)%len]<s[(j+k)%len])        {            i=i+k+1;            if(i==j)                j++;        }        else        {            j=j+k+1;            if(j==i)                i++;        }    }    return min(i,j);}int MaxRep(string s, int l)    {        int i,j,k;      i=0;j=1;k=0;      while(i<l&&j<l)      {          k=0;          while(s[i+k]==s[j+k]&&k<l) k++;          if(k==l) return i;          if(s[i+k]<s[j+k])   //??3é′óóú?íê?×?D?±íê?         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;       }      if(i<l) return i;      else return j;  }  void init(){for(int i=0;i<n;i++){cin>>a[i];}for(int i=0;i<n;i++){for(int j=0;j<m;j++){b[j]+=a[i][j];}}}void solve(){//先对行处理 sort(a,a+n,cmp); for(int i=0;i<n;i++){string t=a[i];for(int j=0;j<n;j++){if(i!=j){t+=a[j];}}//int p=MaxRep(t,t.size());//找到最大字典序的起始位置 int p=get_max(t);string pre=t.substr(0,p);//把起始位置前面的取出来 t.erase(0,p);//在原串中删掉 t+=pre;//加到以最大字典序为起点的后面 ans=max(ans,t);//比较大小 }//再对列处理 sort(b,b+m,cmp);for(int i=0;i<m;i++){string t=b[i];for(int j=0;j<m;j++){if(i!=j){t+=b[j];}}//int p=MaxRep(t,t.size());int p=get_max(t);string pre=t.substr(0,p);t.erase(0,p);t+=pre;ans=max(ans,t);}int len=ans.size();for(int i=0;i<len;i++){if(ans[i]!='0'){for(int j=i;j<len;j++){putchar(ans[j]);}puts("");return ;}} }int main(){scanf("%d%d",&n,&m);init();solve();return 0;} 


阅读全文
0 0