题目:
模板题,最大表示法,对字符串预处理一下就好了。
AC代码:
/*
2017年8月30日10:41:29
Problem 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;
}