10pts只AC#1求调
查看原帖
10pts只AC#1求调
713914
Phoenix_2010楼主2024/8/29 20:56
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7,N=1e5+5;
struct node{unsigned long long h1,h2;int len;char op;};
string s;int T,cnt,ht1[N],ht2[N];bool dp[15][N],sum[15][N];vector<node> a;unsigned long long pw[N]={1},pw2[N]={1};
inline void init()
{
    a.push_back({0,0,0,' '});s+='0';
    unsigned long long tmp=(s[0]=='?'||s[0]=='*'?0:s[0]),tmp2=tmp;int l=(s[0]!='?'&&s[0]!='*');char pre=(s[0]=='?'||s[0]=='*'?s[0]:' ');
    for(int i=1;i<s.size();i++)
    {
        if(s[i]=='?'||s[i]=='*') {a.push_back({tmp,tmp2,l,pre});tmp=tmp2=l=0;pre=s[i];continue;}
        (tmp=(tmp<<1)+s[i])%=mod;(tmp2=(tmp2<<1)+s[i])%=INT_MAX;l++;
    }
    if(tmp) a.push_back({tmp,tmp2,l,pre});
    cnt=a.size()-1;
}
inline bool cmp(int i,int j){return a[i].h1==(ht1[j]-ht1[j-a[i].len]*pw[a[i].len]%mod+mod)%mod&&a[i].h2==(ht2[j]-ht2[j-a[i].len]*pw2[a[i].len]%INT_MAX+INT_MAX)%INT_MAX;}
int main()
{
    ios::sync_with_stdio(false);
    cin>>s>>T;
    init();
    while(T--)
    {
        memset(dp,false,sizeof(dp));memset(sum,false,sizeof(sum));
        string t;cin>>t;int n=t.size()+1;t=" "+t+'0';
        for(int i=1;i<=n;i++) (ht1[i]=(ht1[i-1]<<1)+t[i])%=mod,(ht2[i]=(ht2[i-1]<<1)+t[i])%=INT_MAX,(pw[i]=pw[i-1]<<1)%=mod,(pw2[i]=pw2[i-1]<<1)%=INT_MAX;
        sum[0][0]=dp[0][0]=1;for(int i=1;i<=n;i++) sum[0][i]=sum[0][i-1]|dp[0][i];
        for(int i=1;i<=cnt;i++)
        {
            for(int j=a[i].len;j<=n;j++)
            {
                if(cmp(i,j))
                {
                    if(a[i].op==' ') dp[i][j]=dp[i-1][j-a[i].len];
                    else if(a[i].op=='?'&&j>a[i].len) dp[i][j]=dp[i-1][j-a[i].len-1];
                    else if(a[i].op=='*') dp[i][j]=sum[i-1][j-a[i].len];
                }
            }
            sum[i][0]=dp[i][0];for(int j=1;j<=n;j++) sum[i][j]=sum[i][j-1]|dp[i][j];
        }
        cout<<(dp[cnt][n]?"YES\n":"NO\n");
    }
    return 0;
}

马蜂有亿点难看

2024/8/29 20:56
加载中...