题目
数据
3
RYBGRYBGR
!RGYB
!!!YGRB
思路
这个题目的要求注定给的字符串任取四个相邻的子字符串,RYBG各占据一个,于是我们可以遍历一遍字符串来看看RYBG对应的在哪个位次,然后mod4可以得到对应的第一次出现位置//注意可以有一个字符从头到尾都没出现过,需要特殊判断在哪个为止,比如说R从头到尾没出现过,那么就得
6
−
f
(
G
)
−
f
(
Y
)
−
f
(
B
)
6-f(G)-f(Y)-f(B)
6−f(G)−f(Y)−f(B)
然后每次跨越4,看哪个字母变成了!+1即可
#include<iostream>
#include<cstring>
using namespace std;
void func(string & s)
{
int light[130];
memset(light, 0 , sizeof(light));
int len = s.length();
int i,j,k,l;
i = j = k = l = 0;
while(i < len && s[i] != 'R')
i++;
while(j < len && s[j] != 'B')
j++;
while(k < len && s[k] != 'Y')
k++;
while(l < len && s[l] != 'G')
l++;
if(i == len)
{
j%=4;k%=4;l%=4;
i = 6 - j - k - l;
}
if(j == len)
{
i%=4;k%=4;l%=4;
j = 6 - i - k - l;
}
if(k == len)
{
j%=4;i%=4;l%=4;
k = 6 - j - i - l;
}
if(l == len)
{
j%=4;k%=4;i%=4;
l = 6 - j - k - i;
}
i%=4;j%=4;k%=4;l%=4;
//cout << i<<'R' << j <<'B'<< k<<'y' << l<<"g" <<endl;
for(;i < len || j < len || k < len || l < len; i+=4, j+=4, k+=4, l+=4)
{
if(s[i] != 'R' && i < len)
light['R']++;
if(s[j] != 'B' && j < len)
light['B']++;
if(s[k] != 'Y' && k < len)
light['Y']++;
if(s[l] != 'G' && l < len)
light['G']++;
}
cout << light['R'] << " " << light['B'] << " " << light['Y'] << ' ' << light['G'] << endl;
}
int main()
{
int t;
cin >> t;
for(int i = 0; i < t; i++)
{
cout << "case #" << i << ":"<<endl;
string s;
cin >> s;
func(s);
}
return 0;
}