样例没过求调(6变成了12)
查看原帖
样例没过求调(6变成了12)
658022
zhengjiawei楼主2023/1/31 14:59
#include<bits/stdc++.h>

using namespace std;

string c,t;
int n,tot,len,in[200005];

struct ACC{
    int ch[26];
    int fail;
    int end;
}AC[200005];

struct node{
    int cnt,pos;
    bool operator < (const node&hhh) const {
        if(cnt!=hhh.cnt)
            return cnt>hhh.cnt;
        return pos<hhh.pos;
    }
}f[200005];

void getfail(){
    queue <int> q;
    for(int i=0;i<26;++i){
        if(AC[0].ch[i]){
            AC[AC[0].ch[i]].fail=0;
            in[0]++;
            q.push(AC[0].ch[i]);
        }
    }
    while(!q.empty()){
        int r=q.front();q.pop();
        for(int i=0;i<26;++i){
            if(AC[r].ch[i]){
                AC[AC[r].ch[i]].fail=AC[AC[r].fail].ch[i];
				++in[AC[AC[r].fail].ch[i]];
                q.push(AC[r].ch[i]);
            }
            else{
                AC[r].ch[i]=AC[AC[r].fail].ch[i];
            }
        }
    }
}

void toAC(){
    len=t.size();
    int p=0;
    for(int i=0;i<len;++i){
        p=AC[p].ch[t[i]-'a'];
        ++f[AC[p].end].cnt;
    }
}

void topu(){
	queue<int> q;
	for(int i=1;i<=tot;++i)
		if(!in[i])
			q.push(i);
	while(!q.empty()){
		int r=q.front();q.pop();
		int vv=AC[r].fail;
		//cout<<vv<<" "<<AC[vv].end<<endl; 
		f[AC[vv].end].cnt+=f[AC[r].end].cnt;
		if(--in[vv]==0)
			q.push(vv);
	} 
}

int main(){
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>c;
        int len=c.size();
        int p=0;
        for(int j=0;j<len;++j){
            if(!AC[p].ch[c[j]-'a'])
                AC[p].ch[c[j]-'a']=++tot;
            p=AC[p].ch[c[j]-'a'];
        }
        if(!AC[p].end)
        	AC[p].end=i,f[i].pos=i;
        else
            f[i].pos=AC[p].end;
        //cout<<p<<" "<<AC[p].end<<endl;
    }
    cin>>t;
    getfail();
    toAC();
    topu();
    for(int i=1;i<=n;++i)
        cout<<f[f[i].pos].cnt<<'\n';
    return 0;
}
2023/1/31 14:59
加载中...