标签:play cst int ems 部分 长度 差值 amp pac
是套废题。T1题面错了,T2细节多而暴力>部分分,T3题目错了。
T1:打表
题面应该是输出差值期望而不是答案值期望。
看到题目,果断打表。
答案就是所有值差之和除2的k次方。
1 #include<cstdio> 2 int k,a[333333];long long ans; 3 int main(){ 4 freopen("table.in","r",stdin);freopen("table.out","w",stdout); 5 scanf("%d%lld",&k,&ans); 6 for(int i=0;i<1<<k;++i)scanf("%d",&a[i]); 7 ans=a[ans]; 8 for(int i=0;i<1<<k;++i)a[i]-=ans; 9 for(int i=0;i<1<<k;++i)if(a[i]<0)a[i]*=-1;ans=0; 10 for(int i=0;i<1<<k;++i)ans+=a[i];ans%=1000000007; 11 for(int i=1;i<=k;++i)ans=ans*500000004%1000000007; 12 printf("%lld\n",ans); 13 }
T2:蛇
蛇的路径一定是先走一个左括号形,再曲折右走,再走一个右括号。
Hash。处理左括号右括号。
dp。处理曲折前行。
左括号的预处理答案作为dp数组的初值。
细节很多,注意单独一个左括号/右括号的情况。
注意长度为1的括号不算括号,但是长度为0的算。
调4个小时就能AC了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ul unsigned long long 4 const int mod=1e9+7; 5 int ans,n,l,dp[2][2005][2005],DP[2][2005][2005],ok=1; 6 char s[2][2005],S[2005];ul hsh[2][2005],ihsh[2][2005],shsh[2005],pw[2005]; 7 ul Hsh(int opt,int l,int r){return hsh[opt][r]-hsh[opt][l-1]*pw[r-l+1];} 8 ul Ihsh(int opt,int r,int l){return ihsh[opt][l]-ihsh[opt][r+1]*pw[r-l+1];} 9 ul Shsh(int l,int r){return shsh[r]-shsh[l-1]*pw[r-l+1];} 10 int main(){ 11 freopen("snake.in","r",stdin);freopen("snake.out","w",stdout); 12 scanf("%s%s%s",s[0]+1,s[1]+1,S+1); 13 while(s[0][n+1])n++;while(S[l+1])l++;bg: 14 if(l==1){for(int i=0;i<2;++i)for(int j=1;j<=n;++j)if(s[i][j]==S[1])ans++;cout<<ans<<endl;return 0;} 15 if(l==2){ 16 for(int i=0;i<2;++i)for(int j=1;j<n;++j)if(s[i][j]==S[1]&&s[i][j+1]==S[2])ans++; 17 for(int j=1;j<=n;++j)if(s[0][j]==S[1]&&s[1][j]==S[2])ans++; 18 for(int i=0;i<2;++i)for(int j=2;j<=n;++j)if(s[i][j]==S[1]&&s[i][j-1]==S[2])ans++; 19 for(int j=1;j<=n;++j)if(s[1][j]==S[1]&&s[0][j]==S[2])ans++; 20 cout<<ans<<endl;return 0; 21 } 22 for(int i=0;i<2;++i)for(int j=1;j<=n;++j)hsh[i][j]=hsh[i][j-1]*29+s[i][j]-‘a‘; 23 for(int i=0;i<2;++i)for(int j=n;j;--j)ihsh[i][j]=ihsh[i][j+1]*29+s[i][j]-‘a‘; 24 pw[0]=1;for(int i=1;i<=n;++i)pw[i]=pw[i-1]*29; 25 for(int i=1;i<=l;++i)shsh[i]=shsh[i-1]*29+S[i]-‘a‘; 26 for(int i=0;i<=n;++i)for(int j=0;j<=i&&j<<1<=l;++j)for(int k=0;k<2;++k) 27 if(Hsh(k,i-j+1,i)==Shsh(j+1,j<<1)&&Ihsh(k^1,i,i-j+1)==Shsh(1,j)) 28 dp[k][i+1][j<<1|1]+=s[k][i+1]==S[j<<1|1],ans+=(j<<1==l)*ok; 29 for(int i=1;i<=n+1;++i)for(int j=0;j<<1<=l&&i+j-1<=n;++j)for(int k=0;k<2;++k) 30 if(Hsh(k,i,i+j-1)==Shsh(l-j-j+1,l-j)&&Ihsh(k^1,i+j-1,i)==Shsh(l-j+1,l)) 31 DP[k][i][l-j-j+1]+=(s[k][i]==S[l-j-j+1]||j==0),ans+=((j<<1)==l)*ok; 32 for(int k=0;k<2;++k)for(int i=0;i<=n+1;++i)dp[k][i][3]=DP[k][i][l-1]=0; 33 for(int i=2;i<n;++i)for(int j=3;j<l;++j)for(int k=0;k<2;++k)ans+=dp[k][i][j]*DP[k][i][j]; 34 for(int k=0;k<2;++k)for(int i=1;i<=n;++i)if(s[k][i]==S[1])dp[k][i][1]=1; 35 for(int i=0;i<=n;++i){ 36 for(int j=l;j>1;--j)for(int k=0;k<2;++k)if(i&&s[k][i]==S[j])dp[k][i][j]=(dp[k][i][j]+dp[k][i-1][j-1])%mod; 37 for(int j=l;j>1;--j)for(int k=0;k<2;++k)if(i&&s[k][i]==S[j])dp[k][i][j]=(dp[k][i][j]+dp[k^1][i][j-1])%mod; 38 for(int j=l;~j;--j)for(int k=0;k<2;++k)ans=(ans+1ll*dp[k][i][j]*DP[k][i+1][j+1])%mod; 39 } 40 // for(int k=0;k<=1+l;++k,puts(""))for(int i=0;i<2;++i,puts(""))for(int j=1;j<=n+1;++j)printf("%d/%d ",dp[i][j][k],DP[i][j][k]); 41 if(ok){reverse(S+1,S+l+1);memset(dp,0,sizeof dp);memset(DP,0,sizeof DP);ok=0;goto bg;} 42 cout<<ans<<endl; 43 }
T3:题目
废题。
标签:play cst int ems 部分 长度 差值 amp pac
原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/11832860.html