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