其实这题不超时完全是因为串长度太小,如果串够长,一次匹配后都要往上跳,复杂度是n^2的。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #include <bitset> #define mkp make_pair using namespace std; const double EPS=1e-12; typedef long long lon; const lon SZ=700010,SSZ=12,APB=26,one=1,INF=0x7FFFFFFF,mod=1000000007; int n,cnt,dp[SZ][2],pre[SZ],len[SZ]; int nex[SZ][APB],fail[SZ]; struct nd{ int pos,type; nd(int a=0,int b=0):pos(a),type(b){} }; nd qry[SZ]; char ch[SZ],str[10]; void add(int x) { int cur=0; for(int i=1;str[i];++i) { int c=str[i]-'a'; if(!nex[cur][c])nex[cur][c]=++cnt; cur=nex[cur][c]; } qry[x].pos=cur; len[cur]=strlen(str+1); } void build() { queue<int> q; q.push(0); for(;q.size();) { int fr=q.front(); q.pop(); for(int i=0;i<APB;++i) { int t=nex[fr][i]; if(t) { if(!fr) { fail[t]=fr; } else { int u=fail[fr]; for(;u&&!nex[u][i];u=fail[u]); u=nex[u][i]; fail[t]=u; } q.push(t); } } } } void init() { //cin>>n; scanf("%d",&n); for(int i=1;i<=n;++i) { int type; //cin>>type>>str+1; scanf("%d",&type); scanf(" %s",str+1); add(i); qry[i].type=type; } build(); } int getnex(int x,int c) { for(;x&&!nex[x][c];x=fail[x]); x=nex[x][c]; return x; } void update(int x,int pos) { for(;x;x=fail[x]) { ++dp[x][0]; if(pos-pre[x]>=len[x]) { ++dp[x][1]; pre[x]=pos; } } } void work() { int cur=0; for(int i=1;ch[i];++i) { int c=ch[i]-'a'; cur=getnex(cur,c); update(cur,i); } for(int i=1;i<=n;++i) { printf("%d\n",dp[qry[i].pos][qry[i].type]); //cout<<<<endl; } } void release() { for(int i=0;i<=cnt;++i) { memset(nex[i],0,sizeof(nex[i])); memset(dp[i],0,sizeof(dp[i])); pre[i]=0; } cnt=0LL; } int main() { //std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); int casenum; //cin>>casenum; //cout<<casenum<<endl; //for(int time=1;time<=casenum;++time) for(int time=1;scanf(" %s",ch+1)!=EOF;++time) { //cout<<""<<<<endl; //if(time!=1) printf("Case %d\n",time); init(); work(); release();printf("\n"); } return 0; }