萌新刚学kmp,0pt求助
查看原帖
萌新刚学kmp,0pt求助
749665
huta0楼主2024/7/20 12:52
#include <iostream>
#include <vector>
#include <string.h>
#define ai_jiang signed main()
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define drep(a,b,c) for(int a=b;a>=c;a--)
#define all(a) a.begin(),a.end()
#define ll long long
using namespace std;
using poly=vector<ll>;
namespace ai {
    constexpr int N = 1e6+5,mod = 1e9+7;
    int t,fa[N],dep[N],top[N],siz[N],hs[N],pi[N],ans;
    char s[N];
    vector<int> e[N];
    vector<int> tp[N];
    void clr() {
        int sz=strlen(s+1);
        rep(i,0,sz) e[i].clear(),tp[i].clear();
        memset(fa,0,sizeof(fa));
        memset(dep,0,sizeof(dep));
        memset(top,0,sizeof(top));
        memset(siz,0,sizeof(siz));
        memset(pi,0,sizeof(pi));
        memset(hs,-1,sizeof(hs));
    }
    void kmp(char *s) {
        int sz=strlen(s+1); e[1].push_back(0); e[0].push_back(1);
        for(int i=2,j=0;i<=sz;i++) {
            while(j&&s[i]!=s[j+1]) j=pi[j];
            if(s[i]==s[j+1]) pi[i]=(++j);
            e[i].push_back(j);
            e[j].push_back(i);
        }
    }
    void dfs1(int u,int f) {
        dep[u]=dep[f]+1;
        siz[u]=1;
        fa[u]=f;
        for(auto v:e[u]) {
            if(v==f) continue;
            dfs1(v,u); siz[u]+=siz[v];
            if(hs[u]==-1||siz[v]>siz[hs[u]]) hs[u]=v;
        }
    }
    void dfs2(int u,int t) {
        top[u]=t; tp[t].push_back(u);
        if(!hs[u]) return;
        dfs2(hs[u],t);
        for(auto v:e[u]) {
            if(v==fa[u]||v==hs[u]) continue;
            dfs2(v,v);
        }
    }
    int qry(int x) {
        int tar=x>>1;
        while(x) {
            if(top[x]>tar) x=fa[top[x]];
            else {
                auto pos = lower_bound(tp[top[x]].begin(), tp[top[x]].end(), tar);
                while(*pos > tar) {
                    if(pos == tp[top[x]].begin()) return 1;
                    else --pos;
                }
                return dep[*pos];
            }
        } return 1;
    }
    void solve() {
        scanf("%s",s+1); int sz=strlen(s+1); ans=1;
        clr();
        kmp(s); 
        dfs1(0,0); dfs2(0,0);
        rep(i,1,sz) ans*=(qry(i)),ans=(ans%mod+mod)%mod;
        cout<<ans<<'\n';
    }
}
using namespace ai;
ai_jiang {
    cin.tie(0); cout.tie(0);
    cin>>t;
    while(t--) solve();
    return 0;
}
2024/7/20 12:52
加载中...