topcoder srm 708 div1 -3
2017-03-04 15:48
211 查看
1、定义一个字符串s,定义函数$f(s)=\sum_{i=1}^{i<|s|}[s_{i-1}\neq s_{i}]$,给定字符串$p,q$,定义函数$g(p,q)=\sum_{c='a'}^{c<='z'}count(p,c)*count(q,c)$。其中 $count(s,c)$表示字符$c$在$s$中出现的次数。给定整数N,构造一个包含N个字符串的集合$S$,每个字符串仅有小写字母构成且每个字符串长度不超过100,使得$S$满足$\sum_{s\in S}f(s)=\sum_{p,q\in S \wedge p\neq q}g(p,q)$。右侧计算了$\frac{N(N-1)}{2}$对串的$g$值。
思路:假定由w,x,y,z组成的串的长度都是1,那么他们只对$g$有贡献,而剩下的字符每两个构成一个串,且任意两个串不使用同一个字符,那么这些串只对$f$有贡献。
2、给定一个字符串s,定义$f(i)$表示包含$s_{i}$的子列中回文串的个数。定义$y_{i}=(i+1)*x_{i}%1000000007$。计算所有$y_{i}$的抑或值。
思路:定义$f(L,R)$表示仅由s[L~R]字符组成的回文串的个数,$g(L,R)$表示这样的回文串的个数:回文串的一半由s[0~L]中的字符构成,一半由s[R~|s|]字符组成。$f(L,R)=f(L+1,R)+f(L,R-1)-f(L+1,R-1)[s_{L}\neq s_{R}]$,$g(L,R)=g(L-1,R)+g(L,R+1)-g(L-1,R+1)[s_{L}\neq s_{R}]$。
$f$的理解方式:$f(L+1,R)=f(L+1,R-1)+{带有R不带有L}$,$f(L,R-1)=f(L+1,R-1)+{带有L不带有R}$,而如果$s_{L}\neq s_{R}$,那么$f(L+1,R-1)$就重算了;否则当$s_{L}和s_{R}$都要时的方案还是$f(L+1,R-1)$。这时候不需要减去。$g$的理解类似。
思路:假定由w,x,y,z组成的串的长度都是1,那么他们只对$g$有贡献,而剩下的字符每两个构成一个串,且任意两个串不使用同一个字符,那么这些串只对$f$有贡献。
#include <iostream> #include <stdio.h> #include <vector> #include <map> #include <algorithm> #include <string> #include <string.h> #include <set> using namespace std; #define F(x) ((x)*(x-1)/2) class BalancedStrings { public: vector<string> findAny(int N) { if(N<=26) { vector<string> ans; for(int i=0;i<N;++i) { string s=""; s+='a'+i; ans.push_back(s); } return ans; } for(int w=0;w<=N;++w) for(int x=w;w+x<=N;++x) { for(int y=x;w+x+y<=N;++y) for(int z=y;w+x+y+z<=N;++z) { const int S=F(w)+F(x)+F(y)+F(z); const int K=N-w-x-y-z; if(K>11) continue; const int T=(S+98)/99; if(T>K) continue; vector<string> ans; for(int i=1;i<=w;++i) ans.push_back("w"); for(int i=1;i<=x;++i) ans.push_back("x"); for(int i=1;i<=y;++i) ans.push_back("y"); for(int i=1;i<=z;++i) ans.push_back("z"); for(int i=0,x=0;i<T;++i) { const char c='a'+i*2; string s=""; s+=c; while(x<S&&s.size()<100) { (s.size()&1)?s+=c+1:s+=c; ++x; } ans.push_back(s); } char cur='v'; while(ans.size()<N) { string s=""; s+=cur; ans.push_back(s); --cur; } return ans; } } } };
2、给定一个字符串s,定义$f(i)$表示包含$s_{i}$的子列中回文串的个数。定义$y_{i}=(i+1)*x_{i}%1000000007$。计算所有$y_{i}$的抑或值。
思路:定义$f(L,R)$表示仅由s[L~R]字符组成的回文串的个数,$g(L,R)$表示这样的回文串的个数:回文串的一半由s[0~L]中的字符构成,一半由s[R~|s|]字符组成。$f(L,R)=f(L+1,R)+f(L,R-1)-f(L+1,R-1)[s_{L}\neq s_{R}]$,$g(L,R)=g(L-1,R)+g(L,R+1)-g(L-1,R+1)[s_{L}\neq s_{R}]$。
$f$的理解方式:$f(L+1,R)=f(L+1,R-1)+{带有R不带有L}$,$f(L,R-1)=f(L+1,R-1)+{带有L不带有R}$,而如果$s_{L}\neq s_{R}$,那么$f(L+1,R-1)$就重算了;否则当$s_{L}和s_{R}$都要时的方案还是$f(L+1,R-1)$。这时候不需要减去。$g$的理解类似。
#include <iostream> #include <stdio.h> #include <vector> #include <map> #include <algorithm> #include <string> #include <string.h> #include <set> using namespace std; const int mod=1000000007; const int N=3005; int f1 ,f2 ; string S; int dfs1(int ll,int rr) { if(ll>rr) return 1; if(ll==rr) return 2; if(f1[ll][rr]!=-1) return f1[ll][rr]; f1[ll][rr]=(dfs1(ll+1,rr)+dfs1(ll,rr-1))%mod; if(S[ll]!=S[rr]) f1[ll][rr]=(f1[ll][rr]-dfs1(ll+1,rr-1))%mod; return f1[ll][rr]; } int dfs2(int ll,int rr) { if(ll<0||rr>=(int)S.size()) return 1; if(f2[ll][rr]!=-1) return f2[ll][rr]; f2[ll][rr]=(dfs2(ll-1,rr)+dfs2(ll,rr+1))%mod; if(S[ll]!=S[rr]) f2[ll][rr]=(f2[ll][rr]-dfs2(ll-1,rr+1))%mod; return f2[ll][rr]; } class PalindromicSubseq { public: int solve(string s) { memset(f1,-1,sizeof(f1)); memset(f2,-1,sizeof(f2)); const int n=(int)s.size(); S=s; int ans=0; for(int i=0;i<n;++i) { int tmp=0; for(int j=0;j<n;++j) if(s[i]==s[j]) { const int ll=min(i,j); const int rr=max(i,j); tmp+=1ll*dfs1(ll+1,rr-1)*dfs2(ll-1,rr+1)%mod; tmp%=mod; } if(tmp<0) tmp+=mod; tmp=1ll*tmp*(i+1)%mod; ans^=tmp; } return ans; } };
相关文章推荐
- TopCoder SRM 569 DIV2 Level3: MegaFactorialDiv2
- topcoder srm 590 div1
- TopCoder SRM 637 Div2 A
- topcoder srm 340 div1
- [topcoder]SRM 633 DIV 2
- topcoder srm 335 div1
- TOPCODER SRM 612 DIV2
- TopCoder SRM 651 Div2 Problem 500 - FoxAndSouvenirTheNext (DP)
- topcoder SRM 541 div2 250
- topcoder srm 420 div1
- topcoder srm 435 div1
- TopCoder SRM 589 Div2 第3题
- TopCoder SRM 655 Div2 Problem 500 - FoldingPaper2 (思维)
- TopCoder SRM 657 DIV 1
- Topcoder SRM 677 div2
- TopCoder SRM 596 Div2 第3题
- topcoder srm 465 div1
- topcoder srm 712 div1 -23
- Topcoder srm 632 div2
- Topcoder SRM 598 div2