A Secret HDU - 6153 TLE的AC自动机解法
赛中听说反转之后是前缀匹配就想敲自动机了,还好没真做
赛后试了下自动机,居然真T了,删了可惜存一下吧。。。、
回去看看自动机复杂度吧。。。
fread也救不了。。弃疗吧
#include<bits/stdc++.h> #include<stdio.h> #include<algorithm> #include<queue> #include<string.h> #include<iostream> #include<math.h> #include<set> #include<map> #include<vector> #include<iomanip> using namespace std; #define ll long long #define ull unsigned long long #define pb push_back #define FOR(a) for(int i=1;i<=a;i++) const int inf=0x3f3f3f3f; const int maxn=1e6+7; const long long mod=1e9+7; const int sigma='z'-'A'+1; ll ans; struct automata{ int ch[maxn][sigma]; ll val[maxn]; int f[maxn]; int sz; int newnode(){ memset(ch[sz],0,sizeof(ch[sz])); f[sz]=val[sz]=0; return sz++; } void init(){ memset(val,0,sizeof(val)); sz=0; newnode(); } void insert(char *s,int v){ int u=0; int len=strlen(s); for(int i=0;i<len;i++){ int id=s[i]-'A'; if(!ch[u][id])ch[u][id]=newnode(); u=ch[u][id]; val[u]=(1ll*(i+1))%mod; } } void build(){ queue<int>q; q.push(0); while(!q.empty()){ int u=q.front();q.pop(); if(val[f[u]]){ val[u]=(val[u]+val[f[u]])%mod; } for(int i=0;i<sigma;i++){ int v=ch[u][i]; if(!v)ch[u][i]=ch[f[u]][i]; else q.push(v); if(u&&v)f[v]=ch[f[u]][i]; } } } void query(char* s){ int len=strlen(s);int j=0; for(int i=0;i<len;i++){ int id=s[i]-'A'; j=ch[j][id]; if(val[j]){/*cout<<val[j]<<endl;*/ans=(ans+val[j])%mod;} } } }ac; char A[maxn];char B[maxn]; int main(){ int T;scanf("%d",&T); while(T--){ ac.init();ans=0; scanf("%s%s",A,B); reverse(A,A+strlen(A));reverse(B,B+strlen(B)); //for(int i=0;i<strlen(A);i++){ // printf("%c",A[i]); //}puts(""); //for(int i=0;i<strlen(B);i++){ // printf("%c",B[i]); //}puts(""); ac.insert(B,0); ac.build(); ac.query(A); printf("%lld\n",ans); } }