题意:
给你一个字符串 ,A=T
0
_0
0,T
1
_1
1,T
2
_2
2,T
3
.
.
.
.
_3....
3....,T
N
−
1
_N-1
N−1,T
N
_N
N,
然后有两个操作,1.最后一个字符移到最前面形成一个字符串S,2.第一个字符移到最后形成一个字符串B,S=T
N
_N
NT
0
_0
0,T
1
_1
1,T
2
_2
2,T
3
.
.
.
.
_3....
3....,T
N
−
1
_N-1
N−1, B=$,T
1
_1
1,T
2
_2
2,T
3
.
.
.
.
_3....
3....,T
N
−
1
_N-1
N−1,T
N
_N
N, T
0
_0
0,问你如果S==B,需要删除多少个A里面的字符。
题解:
要想满足题意:那么字符必然是aaaaa,或者ababab型,字符是0-9,所以首先处理每个字符的个数 ,然后暴力模拟ab;
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define fio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define mse(a,b) memset(a,b,sizeof a)
#define pb push_back
using namespace std;
const int mod=1e9+7;
const int maxx=1e6+10;
using namespace std;
const long double PI = 3.14159265358979323846;
#define fio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
inline int read()
{ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); } while (isdigit(ch)) { x=x*10+ch-48; ch=getchar(); } return x*f;}
int dp[maxx];
signed main(){
fio
int n;
scanf("%d",&n);
while(n--){
char ss[maxx];
mse(dp,0);
scanf("%s",ss);
int len=strlen(ss);
// cout<<len<<" "<<ss<<endl;
for(int i=0;i<len;i++) dp[ss[i]-'0']++;///处理每个字符个数
int sum=0;
for(int i=0;i<10;i++)///暴力枚举 a.b;
{
sum=max(sum,dp[i]);
for(int j=0;j<10;j++)
{
int pp=0;
if(i==j) continue; //a!=b
for(int k=0;k<len;)
{
while(k<len&&ss[k]-'0'!=i) k++;k++;//判断a
while(k<len&&ss[k]-'0'!=j) k++;k++;//判断b
pp+=(k<=len); //记录ab出现的次数
}
sum=max(pp<<1,sum); //ab是两个字符 所以要<<1
}
}
cout<<len-sum<<endl; //总数-满足题意的
}
// system("pause");
return 0;
}