風行草偃

陪伴,是最长情的告白。

360招聘编程题

/*字符置换,字符串中出现的连续两个“.”。若每次操作把其中最开始的连续两个“.”以一个“.”替代,


* 则可以将函数f(s) 定义为 使得串中不出现连续两个“.”的最小置换次数。  


* 现考虑m个字符替换操作,每次将指定位置的字符替换为给定的字符,求替换后函数f(s)的值。


* 输入描述:输入有若干组,每组的第一行为两个整数n和m,1 <= n, m <= 300000,表示字符串的长度和字符替换操作的次数。


* 第二行为所给的字符串,随后紧跟m行操作,每行由一个正整数x和一个字母c构成,表示将字符串中位置m处的字符置换为字母c。


* 输出描述:对每组输入的每个置换操作,在单独的行中输出函数f(s)的结果


*/


#include <iostream>
#include <cstdio>
using namespace std;


char ch[300010];
int n, m;
int Cal(int x, char c)
{
x -= 1;
if (c == '.')
  //点 
 {
  if (ch[x] == '.')
  {//点换点 
   ch[x] = c;
   return 0;
  }
  else
  {//点换字母 
   int rt = 0;
   if (x - 1 >= 0 && ch[x - 1] == '.')
    rt += 1;
   if (x + 1<n && ch[x + 1] == '.')
    rt += 1;
   ch[x] = c;
   return rt;
  }
 }
else if (c != '.')
 {//字母 


  if (ch[x] != '.')
  {//字母换字母无意义 
   ch[x] = c;
   return 0;
  }
  else if (ch[x] == '.')
  {//字母换点  左边有点少1 右边有点再少1 
   int rt = 0;
   if (x - 1 >= 0 && ch[x - 1] == '.')
    rt -= 1;
   if (x + 1<n && ch[x + 1] == '.')
    rt -= 1;
   ch[x] = c;
   return rt;
  }
 }
}


int main()
{
while (cin >> n >> m)
 {
  getchar();
  int count = 0;
  gets_s(ch);
  for (int i = 0; i<n; i++)
  {
   if (ch[i] == '.'&&ch[i + 1] == '.')
   {
    count += 1;
   }
  }
  //cout << count << endl;


  int x;
  char ct;
  for (int i = 0; i<m; i++)
  {
   scanf_s("%d %c", &x, &ct);
   //printf("%d %c\n",x,ct);
   count += Cal(x, ct);
   cout << count << endl;
  }


 }
}


评论

© 風行草偃 | Powered by LOFTER