目录

CF1389C-Good String

CF1389C-Good String

题目:

题目描述:

Let’s call left cyclic shift of some string $ t_1 t_2 t_3 \dots t_{n - 1} t_n $ as string $ t_2 t_3 \dots t_{n - 1} t_n t_1 $ .

Analogically, let’s call right cyclic shift of string $ t $ as string $ t_n t_1 t_2 t_3 \dots t_{n - 1} $ .

Let’s say string $ t $ is good if its left cyclic shift is equal to its right cyclic shift.

You are given string $ s $ which consists of digits 0–9.

What is the minimum number of characters you need to erase from $ s $ to make it good?

输入格式:

The first line contains single integer $ t $ ( $ 1 \le t \le 1000 $ ) — the number of test cases.

Next $ t $ lines contains test cases — one per line. The first and only line of each test case contains string $ s $ ( $ 2 \le |s| \le 2 \cdot 10^5 $ ). Each character $ s_i $ is digit 0–9.

It’s guaranteed that the total length of strings doesn’t exceed $ 2 \cdot 10^5 $ .

输出格式:

For each test case, print the minimum number of characters you need to erase from $ s $ to make it good.

样例:

样例输入 1:

1
2
3
4
3
95831
100120013
252525252525

样例输出 1:

1
2
3
3
5
0

思路:

实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "ybwhead/ios.h"
string s;
const int maxn = 2e5 + 10;
int dp[maxn][10][10];
int main()
{
    int TTT;
    yin >> TTT;
    while (TTT--)
    {
        yin >> s;
        int n = s.size();
        if (n <= 2)
        {
            cout << 0 << endl;
            continue;
        }
        for (int i = 1; i <= n; i++)
        {
            for (int j = 0; j <= 9; j++)
            {
                for (int k = 0; k <= 9; k++)
                {
                    dp[i][j][k] = dp[i - 1][j][k];
                    if (s[i - 1] == j + '0')
                        dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][j] + 1);
                }
            }
        }
        int ans = n;
        for (int i = 0; i <= 9; i++)
            ans = min(ans, n - dp[n][i][i]);
        for (int i = 0; i <= 9; i++)
            for (int j = 0; j <= 9; j++)
                if (dp[n][i][j] % 2 == 0)
                    ans = min(ans, n - dp[n][i][j]);
        cout << ans << endl;
    }
    return 0;
}