結果
| 問題 |
No.2020 Sum of Common Prefix Length
|
| コンテスト | |
| ユーザー |
👑 potato167
|
| 提出日時 | 2022-07-22 22:21:35 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 207 ms / 2,000 ms |
| コード長 | 3,381 bytes |
| コンパイル時間 | 2,186 ms |
| コンパイル使用メモリ | 207,360 KB |
| 最終ジャッジ日時 | 2025-01-30 12:33:30 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 38 |
ソースコード
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define _GLIBCXX_DEBUG
using namespace std;
using std::cout;
using std::cin;
using std::endl;
using ll=long long;
using ld=long double;
ll ILL=2167167167167167167;
const int INF=2100000000;
const ll mod=998244353;
#define rep(i,a) for (ll i=0;i<a;i++)
#define all(p) p.begin(),p.end()
template<class T> using _pq = priority_queue<T, vector<T>, greater<T>>;
template<class T> ll LB(vector<T> &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> ll UB(vector<T> &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> bool chmin(T &a,const T &b){if(a>b){a=b;return 1;}else return 0;}
template<class T> bool chmax(T &a,const T &b){if(a<b){a=b;return 1;}else return 0;}
template<class T> void So(vector<T> &v) {sort(v.begin(),v.end());}
template<class T> void Sore(vector<T> &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});}
void yneos(bool a){if(a) cout<<"Yes\n"; else cout<<"No\n";}
template<class T> void vec_out(vector<T> &p){for(int i=0;i<(int)(p.size());i++){if(i) cout<<" ";cout<<p[i];}cout<<"\n";}
namespace po167{
template<int char_size,int base>
struct Trie_Tree
{
struct Node{
std::vector<int> next_node;
std::vector<int> accept_node;
int parent_node;
int char_number;
int cou;
Node(int c_):next_node(char_size),char_number(c_),parent_node(-1),cou(0){
for(int i=0;i<char_size;i++) next_node[i]=-1;
}
};
std::vector<Node> nodes;
Trie_Tree(){
nodes.push_back(Node(-1));
}
vector<int> insert(std::string &word,int word_id){
int node_id=0;
vector<int> ids;
for(int i=0;i<(int)word.size();i++){
int c=(int)(word[i]-base);
int next_id=nodes[node_id].next_node[c];
if(next_id==-1){
next_id=(int)nodes.size();
nodes.push_back(Node(c));
}
nodes[next_id].cou++;
nodes[next_id].parent_node=node_id;
nodes[node_id].next_node[c]=next_id;
nodes[next_id].accept_node.push_back(word_id);
node_id=next_id;
ids.push_back(node_id);
}
return ids;
}
int min_insert(char ch,int node_id,int word_id){
int c=(int)(ch-base);
int next_id=nodes[node_id].next_node[c];
if(next_id==-1){
next_id=(int)nodes.size();
nodes.push_back(Node(c));
}
nodes[next_id].cou++;
nodes[next_id].parent_node=node_id;
nodes[node_id].next_node[c]=next_id;
nodes[next_id].accept_node.push_back(word_id);
node_id=next_id;
return node_id;
}
};
}
using po167::Trie_Tree;
void solve();
// oddloop
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t=1;
//cin>>t;
rep(i,t) solve();
}
void solve(){
int N;
cin>>N;
string S;
vector<vector<int>> ids(N);
po167::Trie_Tree<26,(int)('a')> T;
rep(i,N){
string S;
cin>>S;
ids[i]=T.insert(S,i);
//vec_out(ids[i]);
}
//cout<<endl;
int Q;
cin>>Q;
vector<ll> base(N);
int B=600;
rep(i,N){
for(int j=B;j<(int)(ids[i].size());j++){
base[i]+=(int)(T.nodes[ids[i][j]].accept_node.size());
}
}
rep(i,Q){
int t,ind;
cin>>t>>ind;
ind--;
if(t==1){
char c;
cin>>c;
int tmp=T.min_insert(c,(*ids[ind].rbegin()),ind);
if((int)(ids[ind].size())>=B){
base[ind]--;
for(auto x:T.nodes[tmp].accept_node) base[x]++,base[ind]++;
}
ids[ind].push_back(tmp);
}else{
ll ans=base[ind];
rep(j,min((int)(ids[ind].size()),B)) ans+=(ll)(T.nodes[ids[ind][j]].accept_node.size());
cout<<ans<<"\n";
}
}
}
potato167