Codeforces 1466C。犬の詩(貪欲)

ポータル

ここに画像の説明を挿入
入力

7
babba
abaac
codeforces
zeroorez
abcdcba
bbbbbbb
a

出力

1
1
0
1
1
4
0

ここに画像の説明を挿入

トピックの主なアイデア:文字列を提供し、任意の位置の任意の文字を任意の文字に置き換えることができ、文字列内に1より長い回文部分文字列があってはならず、最小限の変更が必要です。

アイデア:
この質問を大まかにシミュレートしたいと思います。サブストリングにパリンドロームサブストリングがないことを確認するため、長いパリンドロームサブストリングは短いパリンドロームサブストリングで共有する必要があります。たとえば、abcbaはbbcによって提供されます。したがって、bbcを破棄すると、この文字列は破棄されます。最短の回文部分文字列は、長さが2のタイプaa、または長さが3のタイプabaとaaaのいずれかに属することがわかりました。これは、文字列に長さ2または3の回文部分文字列が存在しないようにするためです。貪欲な考え方によると、私たちは最適な破壊の解決策を見つけなければなりません。aaタイプの場合、2番目のaが後続の部分文字列に寄与する可能性があるため、2番目の最適値を破棄することを選択します。abaタイプの場合、後続の寄与を回避するために最後の最適値を破棄することを選択します。aaaの場合、Need 2番目と3番目のベストを破壊する可能性のある回文ではないように2つのキャラクターを置き換える。

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N = 2e5+5;


int main()
{
    
    
    int t;
    cin >> t;
    while(t--)
    {
    
    
        int res = 0;
        string str;cin >> str;
        for(int i = 0; i < str.size() - 1; i ++)
        {
    
    
            if(str[i] == '#') continue;
            if(str[i] == str[i + 1])
                str[i+1] = '#',res++;
            if(str[i] == str[i + 2] && i + 2 < str.size())
                str[i+2] = '#',res++;
        }
        cout << res << endl;
    }
}

おすすめ

転載: blog.csdn.net/diviner_s/article/details/112845495