比赛 |
NOIP模拟赛1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
叉叉 |
最终得分 |
100 |
用户昵称 |
crystal |
运行时间 |
0.052 s |
代码语言 |
C++ |
内存使用 |
0.81 MiB |
提交时间 |
2018-02-08 20:44:00 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
template <class E>
inline void read(E &e){
e=0;char c=getchar();bool eh=0;
while(c>'9'||c<'0'){if(c=='-')eh=1;c=getchar();}
while(c>='0'&&c<='9'){e=e*10+c-48;c=getchar();}
if(eh) e=-e;
}
int len;
char a1[100005];
int a[100005];
bool f[100005];
int num[100005];
int start[100005];
int tree[100005];
inline int lowbit(int x){
return x&-x;
}
inline int query(int b){
int pos=b;
int ans=0;
while(pos>0){
ans+=tree[pos];
pos-=lowbit(pos);
}
return ans;
}
int find(int a,int b){
return query(b)-query(a);
}
inline void update(int a,int b){
int pos=a;
while(pos<=len){
tree[pos]+=b;
pos+=lowbit(pos);
}
}
inline void down(int a,int b){
int pos=a;
while(pos<=len){
tree[pos]-=b;
pos+=lowbit(pos);
}
}
int main(){
freopen("xxxx.in","r",stdin);
freopen("xxxx.out","w",stdout);
memset(tree,0,sizeof tree);
gets(a1+1);
len=strlen(a1+1);
for(int i=1;i<=len;++i)
a[i]=a1[i]-'a'+1;
int ans=0;
for(int i=1;i<=len;++i){
if(!f[a[i]]) {
f[a[i]]=1;
start[a[i]]=i;
num[i]=1;
update(i,1);
}
else {
ans+=find(start[a[i]],i);//找从
num[start[a[i]]]=0;//单点修改
down(start[a[i]],1);
f[a[i]]=0;
}
}
printf("%d\n",ans);
return 0;
}