A. LuoTianyi and the Palindrome String
题意:就是给你一个回文串,看它是否有非空子串不回文,显然当他只有一种元素时,不存在非回文子串,反之去掉一个即可
#include <bits/stdc++.h>
using namespace std;
#define Ysanqian ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define int long long
typedef pair<int,int>PII;
const int N=2e5+10,M=1010,inf=1e9;
string s;
map<char,int>mp;
void solve()
{
mp.clear();
cin>>s;
for(int i=0;i<s.size();i++)
mp[s[i]]++;
if(mp.size()==1)
cout<<-1<<endl;
else
cout<<s.size()-1<<endl;
}
int main()
{
Ysanqian;
int T;
//T=1;
cin>>T;
while(T--)solve();
}
B. LuoTianyi and the Table
题意:每组测试给一个n和m,随后给出n*m个数。
要求将这些数放进n*m的矩阵数组中,让其子矩阵的max-min的总和最大。
其实每次都是取矩阵(1,1)到(i,j)这个子矩阵中最大值和最小值,将最大值减去最小值即可,最后将所有的值相加。
我们发现其实就只有两种选择
1:是最大值放左上角,(1,2),(2,1)放最小的两个数
2:是最小值放左上角,(1,2),(2,1)放最大的两个数
当然还与n和m的大小关系有关,所以干脆就让n最大,反之交换n和m
#include <bits/stdc++.h>
using namespace std;
#define Ysanqian ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
//#define int long long
typedef pair<int,int>PII;
const int N=2e5+10,M=1010,inf=1e9;
int g[N];
int n,m;
int maxx,minn;
inline void solve()
{
int ans=0,ans1=0,ans2=0;
cin>>n>>m;
for(int i=1;i<=n*m;i++)
cin>>g[i];
sort(g+1,g+1+n*m);
if(n<m)swap(n,m);
if(n==1)
ans=(g[n*m]-g[1])*(m-1);
else
{
ans1=(g[n*m]-g[1])*(n*m-1-m+1)+(g[n*m]-g[2])*(m-1);
ans2=(g[n*m]-g[1])*(n*m-1-m+1)+(g[n*m-1]-g[1])*(m-1);
ans=max(ans1,ans2);
}
cout<<ans<<endl;
}
int main()
{
Ysanqian;
int T;
//T=1;
cin>>T;
while(T--)solve();
}