#594. 连线交叉

【题目描述】:

现在有一个字符串,每个字母出现的次数均为偶数。接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线...对其他25个字母也做同样的操作。

现在我们想知道有多少对连线交叉。交叉的定义为一个连线的端点在另外一个连线的内部,另外一个端点在外部。

【输入描述】:

一行一个字符串。保证字符串均由小写字母组成,且每个字母出现次数为偶数次。

【输出描述】:

一个整数,表示答案。

【样例输入】:

abaazooabz

【样例输出】:

3

【样例说明】:

/

【时间限制、数据范围及描述】:

时间:2s 空间:256M

对于30% 的数据,字符串长度不超过50。

对于100% 的数据,字符串长度不超过100,000。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
char s[100610];
int kdl[36],ans,las[36];
int main(){
	scanf("%s",s+1);
	int n=strlen(s+1);
	for(int i=1;i<=n;i++){
		int q=s[i]-'a'+1;
		kdl[q]++;
		kdl[q]%=2;
		if(kdl[q]==0){
			for(int j=1;j<=26;j++){
				if(las[j]>las[q]&&kdl[j]){
					ans++;
				}
			}
		}
		las[q]=i;
	}
	printf("%d\n",ans);
	return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/xiongchongwen/p/11601077.html
今日推荐