首页 > 代码库 > 360 3月25日笔试

360 3月25日笔试

偶串题意:

一个字符串所有字符出现次数都是偶数,则称它为偶串。

现在给你一个字符串,你需要输出该字符串中包含多少偶串。这里的字串必须是原串中连续的一段。

比如一个n长度的字符串有n*(n+1)/2个字串

想了一个小时无奈敲了个n^2的上去,90%past

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<iostream>
using namespace std;
const int maxn=100008;
string s;
int solve(int x,int y)
{
	int a[26]={0};
	int sum=0,ans=0;
	for(int i=x;i<y;i++)
	{
		int p=s[i]-‘a‘;
		a[p]++;
		if(a[p]%2==0)
			sum--;
		else
			sum++;
		if(sum==0)	ans++;
	}
	if(x+1<y)
	ans+=solve(x+1,y);
	return ans;
}
int main()
{
	while(cin>>s)
	{
		int len=s.length();
		int ans=solve(0,len);
		printf("%d\n",ans);
	}
	return 0;
 } 

 

结果一看答案,黑人问号??

#include <bits/stdc++.h>
#define maxn 100009
using namespace std;
char s[maxn];
map<int,int>mp;
int n;
int main(){
    scanf("%s",s);
    n = strlen(s);
    mp[0] = 1;
    int cur = 0;
    long long ans = 0;
    for(int i = 0; i < n; i++){
        int x = s[i] - ‘a‘;
        cur ^= (1 << x);
        ans += mp[cur];
        mp[cur]++;
    }
    cout << ans << endl;
    return 0;
}

 mp[cur]的值是一系列的等差数列,因为 最后的答案肯定是一些等差数列的和的。。这个方法是真的巧妙哇

它用位运算存储当前状态,如果有状态重复出现就累加

后面一个题都没有看。。

360 3月25日笔试