SGU 325 Palindrome(贪心)
题目链接: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(贪心)相关推荐
- codeforce-600C. Make Palindrome(贪心)
http://codeforces.com/problemset/problem/600/C: 题意:给你一个小写字母组成的英文串,将它转换为回文串,要求,改变的字母的个数最小,移动字母不算改变字母. ...
- 贪心+构造 Codeforces Round #277 (Div. 2) C. Palindrome Transformation
题目传送门 1 /* 2 贪心+构造:因为是对称的,可以全都左一半考虑,过程很简单,但是能想到就很难了 3 */ 4 /**************************************** ...
- leetcode 1328. Break a Palindrome | 1328. 破坏回文串(贪心)
题目 https://leetcode.com/problems/break-a-palindrome/ 题解 分析所有可能情况,然后贪心. class Solution {public String ...
- SGU 171 Sarov zones【贪心】
贪心算法 原题链接:http://acm.sgu.ru/problem.php?contest=0&problem=171 题目来源: http://acm.hust.edu.cn:8080/ ...
- SGU 327 Yet Another Palindrome(状态压缩DP)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=327 题意:给出n个字符串.构造一个串s使得s包含n个串以及n个串的反串且这n个串在 ...
- codeforces D Santa Claus and a Palindrome(hash+贪心)
思路:计算字符串的正反哈希值.如果字符串不是回文串,并且存在字符串的反串,将这两上串作为构成回文串的两边.如果字符串是回文串,一种是将其作为回文串的中间,另外一种是作为回文串的对称串来处理. 具体代码 ...
- CodeForces 486C Palindrome Transformation 贪心+抽象问题本质
题目:戳我 题意:给定长度为n的字符串,给定初始光标位置p,支持4种操作,left,right移动光标指向,up,down,改变当前光标指向的字符,输出最少的操作使得字符串为回文. 分析:只关注字符串 ...
- Codeforces Round #277 (Div. 2) C. Palindrome Transformations 贪心
思路:只需处理字符串的一半,即:根据右半段来修改左半段.因为同时修改对称的两个字符,所需的操作数与修改一个字符是相等的.为了使操作数最小,应该按顺序来修改. 由于对称性,可将pos > mid的 ...
- 史上最全的SGU题目分类
由于SGU上神题遍地,特列此表,便于训练时分类训练. 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traffic Lights 最短路 104 Little Shop ...
最新文章
- AI时代,为何机器人公司无法盈利只能走向倒闭?
- python3 乱序函数 shuffle 简介
- 2014/08/13 – Backbonejs
- WPF中的Attached Property
- 从吴恩达AI For Everyone中学到的十个重要AI观
- python字典基础知识点
- 我的《Android官方开发文档Training系列课程中文版》的中期翻译计划
- JS无刷新修改URL类似博客园翻页效果
- Image2icon for Mac(icon图标设计软件)
- [Codeforces]860E Arkady and a Nobody-men
- RecyclerView学习(二)之缓存探索
- SSH三大框架的整合(实例)
- 前端基础入门之css表格与表单
- 解决 ZeroDivisionError integer division or modulo by zero
- Cypress总结回顾
- 金蝶旗舰版固定资产计提折旧报错‘费用分配表所引用的*是非明细的核算项目’,如何解决?
- 前端工程师实习面试总结
- 基于python和Opencv将多张图片结合为一张图片的办法
- ICP许可证过期了还能补办吗
- Python爬虫从入门到精通——爬虫实战:爬取今日头条图片新闻