結果
| 問題 |
No.563 超高速一人かるた large
|
| コンテスト | |
| ユーザー |
koyumeishi
|
| 提出日時 | 2015-09-28 17:53:14 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,316 bytes |
| コンパイル時間 | 1,382 ms |
| コンパイル使用メモリ | 88,544 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-10-01 20:00:19 |
| 合計ジャッジ時間 | 2,127 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | AC * 1 WA * 17 |
ソースコード
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <cassert>
#include <algorithm>
using namespace std;
class Rolling_Hash{
public:
int N;
vector<int> p_pow;
const int P;
const int MOD;
vector<vector<int>> hash;
Rolling_Hash(const int n) :
P(vector<int>{10009, 10007}[0/*rand()%2*/]),
MOD(vector<int>{1000000007, 1000000009}[0/*rand()%2*/]),
N(n),
p_pow(n+1)
{
p_pow[0] = 1;
for(int i=1; i<=N; i++){
p_pow[i] = (1LL * p_pow[i-1] * P) % MOD;
}
}
// [l,r)
long long get_hash(int at, int l, int r){
if(r>=hash[at].size()) return -at;
int len = r-l;
return (hash[at][r] - (1LL * hash[at][l]* p_pow[len])%MOD + MOD) % MOD;
}
void insert(const string& s){
//hash[i] = [0,i)
hash.push_back({});
hash.back().resize(s.size()+1);
int at = hash.size() - 1;
for(int i=0; i<s.size(); i++){
hash[at][i+1] = (1LL * hash[at][i] * P + s[i])%MOD;
}
}
};
int lcp(Rolling_Hash& hash, vector<string>& s, int x, int y){
/*
int lb = 0;
int ub = s[x].size();
while(ub-lb>1){
int mid = (lb+ub)/2;
int hash_x = hash.get_hash(x, 0,mid);
int hash_y = hash.get_hash(y, 0,mid);
bool ok = hash_x != hash_y;
if(ok){
ub = mid;
}else{
lb = mid;
}
}
return ub;
*/
int ret = 0;
while(ret<s[x].size() && ret<s[y].size() && s[x][ret] == s[y][ret]) ret++;
return ret+1;
}
int main(){
int n;
cin >> n;
vector<string> s(n);
int m = 0;
for(int i=0; i<n; i++){
cin >> s[i];
s[i] += 'a'-1;
m = max(m, (int)s[i].size());
}
vector<int> x(n);
for(int i=0; i<n; i++){
cin >> x[i];
x[i]--;
}
vector<pair<string, int>> v(n);
for(int i=0; i<n; i++){
v[i] = {s[i], i};
}
sort(v.begin(), v.end());
vector<int> index(n);
vector<int> order(n);
for(int i=0; i<n; i++){
index[i] = v[i].second;
order[v[i].second] = i;
}
set<int> w;
Rolling_Hash hash(m);
for(int i=0; i<n; i++){
hash.insert(s[i]);
}
vector<int> ans(n);
for(int i=n-1; i>=0; i--){
auto itr = w.insert(order[x[i]]).first;
int lcp_len = 1;
if(itr != w.begin()){
itr--;
lcp_len = max(lcp_len, lcp(hash,s, x[i], index[*itr]));
itr++;
}
itr++;
if(itr != w.end()){
lcp_len = max(lcp_len, lcp(hash,s, x[i], index[*itr]));
}
ans[i] = lcp_len;
}
for(int i=0; i<n; i++){
cout << ans[i] << endl;
}
return 0;
}
koyumeishi