基础练习——完美的代价

问题描述  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。  交换的定义是:交换两个相邻的字符  例如mamad  第一次交换 ad : mamda  第二次交换 md : madma  第三次交换 ma : madam (回文!完美!)输入格式  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)  第二行是一个字符串,长度为N.只包含小写字母输出格式  如果可能,输出最少的交换次数。  否则输出Impossible样例输入5mamad样例输出3

#include <cstdio>  #include <cstdlib>    int main()  {  #ifdef LOCAL      freopen("input2.txt", "r", stdin);  #endif      int n, flag = 0, ans = 0;      char *str;      scanf("%d", &n);      str = (char*)malloc(n * sizeof(char));      scanf("%s", str);      int j = n - 1, p = 0;      for(int i = 0; i < j; i++)      {          for(int k = j; k >= 0; k--)          {              if(k == i)              {                  flag++;                  if(n % 2 == 0 || flag > 1)                  {                      printf("Impossible\n");                      return 0;                  }                  p = n/2 - i;                  break;              }              else if(str[k] == str[i])              {                  ans += j - k;              //  printf("ans = %d\n", ans);                  for(int f = k; f < j; f++)                  {                      str[f] = str[f + 1];                  }                  str[j] = str[i];                  j--;                  break;              }           }      }      printf("%d\n", ans + p);      return 0;  }  

实现代码

旅游不在乎终点,而是在意途中的人和事还有那些美好的记忆和景色。

基础练习——完美的代价

相关文章:

你感兴趣的文章:

标签云: