本地正确但是交上去会RE是什么情况
查看原帖
本地正确但是交上去会RE是什么情况
1000298
Vsinger_洛天依楼主2023/12/23 14:53

rt

蒟蒻打了个AC自动机上dp但是RE了

L语言

#include<bits/stdc++.h>
using namespace std;
namespace IO{
    inline void close(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);}
    inline void Fire(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
    inline int read(){int s = 0,w = 1;char ch = getchar();while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}return s*w;}
    inline void write(int x){char F[200];int tmp=x>0?x:-x,cnt=0;;if(x<0)putchar('-') ;while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}if(cnt==0)putchar('0');while(cnt>0)putchar(F[--cnt]);putchar(' ');}
}
using namespace IO;
int maxl=0,f[2000005];
class AC{
public:
    class Trie{
    public:
        int fail,vis[26],end; 
    }Tr[2000005];
    int cnt; 
    inline void clear(){
        memset(f,0,sizeof(f));
    }   
    inline void ins(string s){
        int l=s.length(),q=0;
        for(int i=0;i<l;++i){
            if(!Tr[q].vis[s[i]-'a']) 
                Tr[q].vis[s[i]-'a']=++cnt;
            q=Tr[q].vis[s[i]-'a']; 
        }
        Tr[q].end=l;
        maxl=max(maxl,l);
    }   
    inline void Get(){
        queue<int>Q; 
        for(int i=0;i<26;++i){
            if(Tr[0].vis[i]!=0){
                Tr[Tr[0].vis[i]].fail=0;
                Q.push(Tr[0].vis[i]);
            }
        }
        while(!Q.empty()){
            int u=Q.front();
            Q.pop();
            for(int i=0;i<26;++i){
                if(Tr[u].vis[i]!=0){
                    Tr[Tr[u].vis[i]].fail=Tr[Tr[u].fail].vis[i];
                    Q.push(Tr[u].vis[i]);
                }
                else
                    Tr[u].vis[i]=Tr[Tr[u].fail].vis[i];
            }
        }
    }
    inline int solve(string s){
        int l=s.length(),ans=0,p=0;
        clear();
        f[0]=1;
        for(int i=0;i<l;i++){
            // cout<<i<<" ";
            if(ans+maxl<i) break;
            int q=s[i]-'a';
            p=Tr[p].vis[q];
            for(int j=p;j;j=Tr[j].fail){
                f[i+1]|=f[i+1-Tr[j].end];
                if(f[i+1]) break;
            }           
            if(f[i+1]) ans=i+1;
        }
        // puts("");puts("");
        write(ans);
        // puts("");puts("");
    }
}AC;
signed main(){
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    string s;
    int n=read(),m=read();
    AC.clear();
    for(int i=1;i<=n;++i){
        cin>>s;
        AC.ins(s);
    }
    AC.Get();
    for(int i=1;i<=m;i++){
        cin>>s;
        AC.solve(s);
        puts("");
    }
}

2023/12/23 14:53
加载中...