rainbow与freda染旗
★ 输入文件:shimi.in
输出文件:
shimi.out
简单对比
时间限制:1 s 内存限制:128 MB
【题目背景】
Freda:aya Rainbow,怎么没看见你城堡挂旗子呀?
Rainbow:我城堡旗子太难看了肿么办T_T
Freda:lala~那好办,我可以帮你染色呀~
Rainbow:嗯嗯,那就试试吧~
【题目描述】
Rainbow城堡的旗子是一个有N个基本单位的长条>_<,每个单位都会被染成前m个大写字母当中的一个颜色。可是,Rainbow认为,两个相邻的单位有相同的颜色很难看的说。所以,Rainbow需要改动一些单位的颜色,使得不存在两个相邻的单位颜色相同。当然了,那些被改动的单位改动之后的颜色也是前m个大写字母当中的一个。Rainbow想请你帮忙计算,它最少要改动多少个单位的颜色才能让旗子好看呢?
【输入格式】
第一行两个整数N、m,表示旗子组成的基本单位数目和颜色的范围。
接下来一行一个长度为N的字符串,字符串的每个字符都是在前m个大写字母的范围内的,表示Rainbow的旗帜。
【输出格式】
一行一个整数表示Rainbow最少改动的单位数目。
【样例输入】
6 3 ABBACC
【样例输出】
2
//某大神说用DP,是出题人的失误导致这个题的正解成了模拟
/****
思路:
首先,考虑只有两种颜色的情况,只能是A和B交替组合,我们只需要将ABABAB...AB或BABAB...ABA与原来的进行比较,看看哪个相符程度高,
然后再求出改变的最少的位置数;
其次,考虑三种及三种以上颜色的情况,一面旗子至多有两个邻居,也就是说使用三种颜色完全可以使所有旗子与相邻的不同色。
如果出现两面相邻的旗子同色,我们只需要改后面的那一面旗子,计数,并将旗子进行标记。
如果不标记,当出现AAABCB...这种情况时,答案就会有错误,模拟时,会将第二面和第三面都改变。
****/
#include <stdio.h>
int main()
{
freopen("shimi.in","r",stdin);
freopen("shimi.out","w",stdout);
int n,m;
int i,j,k;
char c[100010]={'\0'};
scanf("%d%d",&n,&m);
scanf("%s",c);
if(m==2)
{
char temp='A';
int d=0;
int s1=0,s2=0;
for(i=0;i<n;i++)
{
if(c[i]!=temp)
s1++;
if(d)
temp='A';
else
temp='B';
d=1-d;
//printf("%c",temp);
}
temp='B';
d=1;
for(i=0;i<n;i++)
{
if(c[i]!=temp)
s2++;
if(d)
temp='A';
else
temp='B';
d=1-d;
//printf("%c",temp);
}
printf("%d\n",s1<s2?s1:s2);
}
else
{
int s=0;
for(i=1;i<n;i++)
{
if(c[i]==c[i-1])
{
s++;
c[i]='-1';
}
}
printf("%d\n",s);
}
return 0;
}