标签:name cstring its const 答案 问号 div 重复 长度
偶串题意:
一个字符串所有字符出现次数都是偶数,则称它为偶串。
现在给你一个字符串,你需要输出该字符串中包含多少偶串。这里的字串必须是原串中连续的一段。
比如一个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]的值是一系列的等差数列,因为 最后的答案肯定是一些等差数列的和的。。这个方法是真的巧妙哇
它用位运算存储当前状态,如果有状态重复出现就累加
后面一个题都没有看。。
标签:name cstring its const 答案 问号 div 重复 长度
原文地址:http://www.cnblogs.com/bitch1319453/p/6618655.html