字符串处理经典题
Posted amaris-diana
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串处理经典题相关的知识,希望对你有一定的参考价值。
字符串处理经典题
1.CF219C Color Stripe(要求修改后的串中相邻字符不相同,求最少修改次数)
Q: 给你一个长度为N 的字符串(由大写字母组成)和一个数量K,K是指可使用的不同的大写字母的个数。现要求修改源字符串,使得串中相邻的两个位置上的元素不同;一次只能更改一个字符,问你最少的修改次数是多少?并输出任意一个满足条件的答案字符串。
A:从字符串第二位开始逐个检查即可,每次维护num[i ]= SG(num[ i- 1 ],num[ i+ 1]);即可 。注意K= 2时可以特判,因为答案串只有"ABABABA...ABA"和"BABAB...BABAB"两种。
原题链接: http://codeforces.com/problemset/problem/219/C
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<map> 7 using namespace std; 8 9 char _sg(char a, char b) 10 11 int x= a- ‘A‘; 12 int y= b- ‘A‘; 13 14 int ans; 15 for (int i= 0; i< 4; i ++) 16 17 if (i!= x&& i!= y) 18 19 ans= i; 20 break; 21 22 23 return (‘A‘+ ans); 24 25 char ss[1000010]; 26 int main() 27 28 int n, k; 29 scanf("%d %d", &n, &k); 30 getchar(); 31 scanf("%s", ss+ 1); 32 ss[0]= ‘#‘; 33 int len= strlen(ss); 34 ss[len]= ‘#‘; 35 len += 1; 36 int cnt= 0; 37 if (k>= 3) 38 39 for (int i= 2; i< len- 1; i ++) 40 41 if (ss[i]== ss[i- 1]) 42 43 ss[i]= _sg(ss[i- 1], ss[i+ 1]); 44 cnt ++; 45 46 47 48 else 49 50 int cnt1= 0; 51 int cnt2= 0; 52 for (int i= 1; i< len- 1; i ++) 53 54 if (i% 2!= ss[i]- ‘A‘) cnt1 ++; 55 else cnt2 ++; 56 57 if (cnt1<= cnt2) 58 59 cnt= cnt1; 60 for (int i= 1; i< len- 1; i ++) 61 62 int cn= i% 2; 63 ss[i]= ‘A‘+ cn; 64 65 66 else 67 68 cnt= cnt2; 69 for (int i= 1; i< len- 1; i ++) 70 71 int cn= (i+1)% 2; 72 ss[i]= ‘A‘+ cn; 73 74 75 76 printf("%d\n", cnt); 77 for (int i= 1; i< len- 1; i ++) 78 79 printf("%c", ss[i]); 80 81 printf("\n"); 82 return 0; 83
以上是关于字符串处理经典题的主要内容,如果未能解决你的问题,请参考以下文章