记录编号 |
53757 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2009]求回文串 |
最终得分 |
100 |
用户昵称 |
feng |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
4.154 s |
提交时间 |
2013-03-05 11:10:03 |
内存使用 |
40.37 MiB |
显示代码纯文本
- #include <cstdio>
- #include <cstring>
- #include <deque>
- #include <algorithm>
- #include <iostream>
- using namespace std;
- const int MAXN=1000005;
- const int oo=0x7fffffff;
- struct tt{
- int delta,data;
- }tree[4000001];
- deque<int> q[26];
-
- char st[MAXN];
-
- int ax,ay,del;
- int a[MAXN];
- int N;
-
- void updata(int left,int right,int root){
- int mid;
- int delta;
- if (ax>right||ay<left) return;
- if (ax<=left&&right<=ay){
- tree[root].data+=del;
- tree[root].delta+=del;
- return;
- }
- mid=(left+right)/2;
- delta=tree[root].delta;
- tree[root*2].delta+=delta;
- tree[root*2].data+=delta;
- tree[root*2+1].data+=delta;
- tree[root*2+1].delta+=delta;
- tree[root].delta=0;
- updata(left,mid,root*2);
- updata(mid+1,right,root*2+1);
- tree[root].data=tree[root*2].data+tree[root*2+1].data;
- }
- int search(int left,int right,int root){
- int delta;
- int mid,templ,tempr;
- if (ax>right || ay<left) return 0;
- if (ax<=left && right<=ay){
- return tree[root].data;
- }
- mid=(left+right)/2;
- delta=tree[root].delta;
- tree[root*2].delta+=delta;
- tree[root*2].data+=delta;
- tree[root*2+1].data+=delta;
- tree[root*2+1].delta+=delta;
- tree[root].delta=0;
- templ=search(left,mid,root*2);
- tempr=search(mid+1,right,root*2+1);
- return templ+tempr;
- }
- bool used[MAXN];
- int str[MAXN];
- int main()
- {
- freopen("string!.in","r",stdin);
- freopen("string!.out","w",stdout);
- scanf("%s",st+1);
- int l=1,r=strlen(st+1);
- N=r;
- for(int i=l;i<=r;i++)
- q[str[i]=st[i]-'A'].push_back(i);
- bool flag=false;
- for(int i=0;i<26;i++)
- if (q[i].size()&1)
- {
- if (!flag) flag=true;
- else
- {
- printf("-1\n");
- return 0;
- }
- }
- long long re=0;
- while(l<r)
- {
- while(used[l])
- l++;
- while(used[r])
- r--;
- if (l>=r)
- break;
- if (str[l]==str[r])
- {
- q[str[l]].pop_front();
- q[str[l]].pop_back();
- l++,r--;
- }
- else
- {
- int w1,w2;
- if (q[str[l]].size()>=2)
- {
- int t=q[str[l]].back();
- ax=t;
- ay=r;
- int tmp=search(1,N,1);
- w1=r-t-tmp;
- }
- else w1=oo;
- if (q[str[r]].size()>=2)
- {
- int t=q[str[r]].front();
- ax=l;
- ay=t;
- int tmp=search(1,N,1);
- w2=t-l-tmp;
- }
- else w2=oo;
- if (w1<w2)
- {
- re+=w1;
- int t=q[str[l]].back();
- ax=t;
- ay=t;
- del=1;
- updata(1,N,1);
- used[t]=true;
- q[str[l]].pop_back();
- q[str[l]].pop_front();
- l++;
- }
- else
- {
- re+=w2;
- int t=q[str[r]].front();
- ax=t;
- ay=t;
- del=1;
- updata(1,N,1);
- used[t]=true;
- q[str[r]].pop_back();
- q[str[r]].pop_front();
- r--;
- }
- }
- }
- cout<<re<<endl;
- //printf("%lld\n",re);
- return 0;
- }