問題の意味:
のみ「Q」、「W」、含まれている長さnはSの文字列、 「E」「R」 の文字の4種類。
N / 4の数の両方が、それは文字の4種類の文字列でバランスが取れている場合、文字列に表示されます。
Sは現在、同じ長さのサブストリングの連続期間とすることができますので、それはバランスの取れた文字列になること、あるいは?ストリングの最小の長さを求めて、唯一の4文字を含む任意の文字列を置き換える
sが0を出力をバランスしている場合を。
入力:
指定された文字列S表す線
出力を:
整数答え
サンプル入力:
QWER
サンプル出力:
0
サンプル入力:
QQWE
サンプル出力:
1つの
サンプル入力:
QQQW
サンプル出力:
2
サンプル入力:
QQQQ
サンプル出力:
3
注:
1 <= N - <= 10 5 ^
N-4の倍数である
列のみ文字'Q'が含まれ、 'W'、 'E' 及びR ''。
アイデア:
入力文字列の各文字の数を決定するには。決意した後、0に被験者の要件に行あたりの文字数がそれ以外の場合は、出力がn文字-n操作よりも大きくなる場合。それが0動作前に記憶された文字の数と比較される各文字の数は、左右の境界によって操作の値の後に再び決定されるように、条件が満たされ、左マージンが減少する格納された残りの文字、文字を満たすため、文字の数が1減少し、常に境界裁判官の周りに移動し、国境を高めるために、右、右ボーダーの出会い文字、文字の数プラス1を満たしていない、答えを更新し、出力。
コード:
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
char temp[4]={'Q','W','E','R'};
map<char,int> ran;
int main()
{
string s;
cin>>s;
//int length=s.length();
for(int i=0;i<s.length();i++)
{
if(s[i]=='Q')
{
ran[temp[0]]++;
}
if(s[i]=='W')
{
ran[temp[1]]++;
}
if(s[i]=='E')
{
ran[temp[2]]++;
}
if(s[i]=='R')
{
ran[temp[3]]++;
}
}
int n=s.length()/4;
if(ran[temp[0]]==n&&ran[temp[1]]==n&&ran[temp[2]]==n&&ran[temp[3]]==n)
{
cout<<"0";
return 0;
}
int num=0;
for(int i=0;i<4;i++)
{
if(ran[temp[i]]>n)
{
ran[temp[i]]=ran[temp[i]]-n;
num=num+ran[temp[i]];
}
else
{
ran[temp[i]]=0;
}
}
int left=0,right=0;
int cm[4]={0};
int ans=s.length();
for(int i=left;i<=right;i++)
{
if(s[i]=='Q')
{
cm[0]++;
}
if(s[i]=='W')
{
cm[1]++;
}
if(s[i]=='E')
{
cm[2]++;
}
if(s[i]=='R')
{
cm[3]++;
}
}
while(right<s.length())
{
if(cm[0]>=ran[temp[0]]&&cm[1]>=ran[temp[1]]&&cm[2]>=ran[temp[2]]&&cm[3]>=ran[temp[3]])
{
if((right-left)<ans)
ans=right-left+1;
if(s[left]=='Q')
cm[0]--;
if(s[left]=='W')
cm[1]--;
if(s[left]=='E')
cm[2]--;
if(s[left]=='R')
cm[3]--;
left++;
}
else
{
right++;
if(s[right]=='Q'&&right!=s.length())
cm[0]++;
if(s[right]=='W'&&right!=s.length())
cm[1]++;
if(s[right]=='E'&&right!=s.length())
cm[2]++;
if(s[right]=='R'&&right!=s.length())
cm[3]++;
}
}
cout<<ans;
return 0;
}