题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=325

题意:给出一个字符串。每次可以交换相邻的两个字母。问最少需要多少次可以使得串变为回文串?

思路:从左向右扫描。对于每一个字符,找到其对应的字母,将其移到右侧相应的位置。设此时长度为len(每次移动完后长度会减去2),前面已经移动了num个,当前要移动的位置为k,[num+1,k-1]区间内已经移动走的位x个,则本次需要移动len-(k-num-x)。那么num是可以直接记录的,x是需要计算的。用树状数组。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <map>#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)>=0?(x):-(x))
#define i64 long long
#define u32 unsigned int
#define u64 unsigned long long
#define clr(x,y) memset(x,y,sizeof(x))
#define CLR(x) x.clear()
#define ph(x) push(x)
#define pb(x) push_back(x)
#define Len(x) x.length()
#define SZ(x) x.size()
#define PI acos(-1.0)
#define sqr(x) ((x)*(x))
#define MP(x,y) make_pair(x,y)#define FOR0(i,x) for(i=0;i<x;i++)
#define FOR1(i,x) for(i=1;i<=x;i++)
#define FOR(i,a,b) for(i=a;i<=b;i++)
#define DOW0(i,x) for(i=x;i>=0;i--)
#define DOW1(i,x) for(i=x;i>=1;i--)
#define DOW(i,a,b) for(i=a;i>=b;i--)
using namespace std;void RD(int &x){scanf("%d",&x);}
void RD(i64 &x){scanf("%I64d",&x);}
void RD(u32 &x){scanf("%u",&x);}
void RD(double &x){scanf("%lf",&x);}
void RD(int &x,int &y){scanf("%d%d",&x,&y);}
void RD(i64 &x,i64 &y){scanf("%I64d%I64d",&x,&y);}
void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);}
void RD(double &x,double &y){scanf("%lf%lf",&x,&y);}
void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);}
void RD(i64 &x,i64 &y,i64 &z){scanf("%I64d%I64d%I64d",&x,&y,&z);}
void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);}
void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);}
void RD(char &x){x=getchar();}
void RD(char *s){scanf("%s",s);}
void RD(string &s){cin>>s;}void PR(int x) {printf("%d\n",x);}
void PR(i64 x) {printf("%I64d\n",x);}
void PR(u32 x) {printf("%u\n",x);}
void PR(double x) {printf("%.6lf\n",x);}
void PR(char x) {printf("%c\n",x);}
void PR(char *x) {printf("%s\n",x);}
void PR(string x) {cout<<x<<endl;}const int N=1000005;
int a[26],n,s[N],last[26],p[N],visit[N];
char str[N];void add(int x)
{while(x<N) s[x]++,x+=x&-x;
}int get(int x)
{int ans=0;while(x) ans+=s[x],x-=x&-x;return ans;
}int main()
{scanf("%s",str+1);n=strlen(str+1);int i,k,t;FOR1(i,n){k=str[i]-'A';a[k]++;p[i]=last[k];last[k]=i;}k=0;FOR0(i,26) k+=(a[i]&1);if(k>n%2) return puts("-1"),0;i64 ans=0,len=n,preNum=0;FOR1(i,n) if(!visit[i]){t=str[i]-'A';k=last[t];if(i>=k){len--;ans+=len/2;}else{ans+=len-(k-preNum-get(k));visit[k]=1;add(k);len-=2;last[t]=p[k];}preNum++;}PR(ans);return 0;
}

  

SGU 325 Palindrome(贪心)相关推荐

  1. codeforce-600C. Make Palindrome(贪心)

    http://codeforces.com/problemset/problem/600/C: 题意:给你一个小写字母组成的英文串,将它转换为回文串,要求,改变的字母的个数最小,移动字母不算改变字母. ...

  2. 贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation

    题目传送门 1 /* 2 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 3 */ 4 /**************************************** ...

  3. leetcode 1328. Break a Palindrome | 1328. 破坏回文串(贪心)

    题目 https://leetcode.com/problems/break-a-palindrome/ 题解 分析所有可能情况,然后贪心. class Solution {public String ...

  4. SGU 171 Sarov zones【贪心】

    贪心算法 原题链接:http://acm.sgu.ru/problem.php?contest=0&problem=171 题目来源: http://acm.hust.edu.cn:8080/ ...

  5. SGU 327 Yet Another Palindrome(状态压缩DP)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=327 题意:给出n个字符串.构造一个串s使得s包含n个串以及n个串的反串且这n个串在 ...

  6. codeforces D Santa Claus and a Palindrome(hash+贪心)

    思路:计算字符串的正反哈希值.如果字符串不是回文串,并且存在字符串的反串,将这两上串作为构成回文串的两边.如果字符串是回文串,一种是将其作为回文串的中间,另外一种是作为回文串的对称串来处理. 具体代码 ...

  7. CodeForces 486C Palindrome Transformation 贪心+抽象问题本质

    题目:戳我 题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文. 分析:只关注字符串 ...

  8. Codeforces Round #277 (Div. 2) C. Palindrome Transformations 贪心

    思路:只需处理字符串的一半,即:根据右半段来修改左半段.因为同时修改对称的两个字符,所需的操作数与修改一个字符是相等的.为了使操作数最小,应该按顺序来修改. 由于对称性,可将pos > mid的 ...

  9. 史上最全的SGU题目分类

    由于SGU上神题遍地,特列此表,便于训练时分类训练. 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traffic Lights 最短路 104 Little Shop ...

最新文章

  1. AI时代,为何机器人公司无法盈利只能走向倒闭?
  2. python3 乱序函数 shuffle 简介
  3. 2014/08/13 – Backbonejs
  4. WPF中的Attached Property
  5. 从吴恩达AI For Everyone中学到的十个重要AI观
  6. python字典基础知识点
  7. 我的《Android官方开发文档Training系列课程中文版》的中期翻译计划
  8. JS无刷新修改URL类似博客园翻页效果
  9. Image2icon for Mac(icon图标设计软件)
  10. [Codeforces]860E Arkady and a Nobody-men
  11. RecyclerView学习(二)之缓存探索
  12. SSH三大框架的整合(实例)
  13. 前端基础入门之css表格与表单
  14. 解决 ZeroDivisionError integer division or modulo by zero
  15. Cypress总结回顾
  16. 金蝶旗舰版固定资产计提折旧报错‘费用分配表所引用的*是非明细的核算项目’,如何解决?
  17. 前端工程师实习面试总结
  18. 基于python和Opencv将多张图片结合为一张图片的办法
  19. ICP许可证过期了还能补办吗
  20. Python爬虫从入门到精通——爬虫实战:爬取今日头条图片新闻

热门文章

  1. DEVO 7E遥控器配对
  2. charles工具页面介绍
  3. JS对cookie进行操作
  4. Django-Model操作数据库(增删改查、连表结构)
  5. [luoguP1095] 守望者的逃离(DP)
  6. strcmp() Anyone? UVA - 11732 左孩子右兄弟Trie/计数
  7. 接口文档生成工具apipost
  8. jmeter之线程组如何使用
  9. Java基础中的基础
  10. 03-09 toast 控件识别