论丧心病狂卡内存的出题人
查看原帖
论丧心病狂卡内存的出题人
128754
方123456楼主2021/11/13 22:27

RT,本题特别卡我的 trie 树内存。

开到 32 MB 。。。。

#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#define pb push_back
using namespace std;
const int INF=3e4+5;
int n,q,tot,ans1[INF];
map <int,map<short,int> >tr;
map <int,map<short,int> >sum;
string s1[INF],s2[INF];
vector <short> vis[INF];
map <string,short> Map;
void ins(string x) {
        int len=x.size(); int rt=0;
        for (int i=0; i<len; i++) {
                if (tr[rt][x[i]-'a']==0)
                        tr[rt][x[i]-'a']=++tot;
                sum[rt][x[i]-'a']++;
                rt=tr[rt][x[i]-'a'];
        }
        return;
}
int ck(string x) {
        int len=x.size(); int rt=0,ans=0;
        for (int i=0; i<len; i++) {
                if (tr[rt][x[i]-'a']==0) break;
                ans+=sum[rt][x[i]-'a'];
                rt=tr[rt][x[i]-'a'];
        }
        return ans;
}
signed main()
{
        ios::sync_with_stdio(false);
        cin>>n;
        for (int i=1; i<=n; i++)
                cin>>s1[i],Map[s1[i]]=i;
        cin>>q;
        for (int i=1; i<=q; i++) {
                cin>>s2[i];
                vis[Map[s2[i]]].pb(i);
        }
        for (int i=1; i<=n; i++) {
                ins(s1[i]);
                if (vis[i].size()) {
                        int len1=vis[i].size();
                        for (int j=0; j<len1; j++)
                                ans1[vis[i][j]]=ck(s2[vis[i][j]])+i;
                }
        }
        for (int i=1; i<=q; i++) {
                if (ans1[i]==0) ans1[i]=ck(s2[i])+n;
                cout<<ans1[i]<<"\n";
        }
        return 0;
}

问 dalao 们,有没有比较好的方法可以帮助我卡进。

2021/11/13 22:27
加载中...