比赛 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;
}