[考试反思]1110csp-s模拟测试108:消遣

Posted hzoi-deepinc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[考试反思]1110csp-s模拟测试108:消遣相关的知识,希望对你有一定的参考价值。

技术图片

是套废题。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
",ans);
13 }
View Code

 

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 }
View Code

 

T3:题目

废题。

以上是关于[考试反思]1110csp-s模拟测试108:消遣的主要内容,如果未能解决你的问题,请参考以下文章

[考试反思]1006csp-s模拟测试61:休止

[考试反思]1022csp-s模拟测试82:奇异

[考试反思]1004csp-s模拟测试59:惊醒

[考试反思]1112csp-s模拟测试111:二重

[考试反思]1012csp-s模拟测试70:盘旋

[考试反思]1025csp-s模拟测试87:生存