結果

問題 No.8014 多項式ハッシュに関する教育的な問題
ユーザー ShaninAndrey
提出日時 2017-05-23 07:54:58
言語 C++11(廃止可能性あり)
(gcc 13.3.0)
結果
AC  
実行時間 3 ms / 5,000 ms
コード長 2,578 bytes
コンパイル時間 1,481 ms
コンパイル使用メモリ 169,056 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-09-19 11:19:42
合計ジャッジ時間 1,847 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 1
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include <bits/stdc++.h>
#define F first
#define S second
using namespace std;
typedef long long ll;
typedef long double ld;
const int max_n = 100011, max_k = 26, inf = 1011111111, p = 37;
vector<pair<ll, ll> > go(vector<pair<ll, ll> > h){
sort(h.begin(), h.end());
if(h[0].F == 0){
vector<pair<ll, ll> > gg;
gg.push_back(make_pair(h[0].S, 1));
return gg;
}
int n = h.size();
if(n == 0) exit(3);
vector<pair<ll, ll> > g;
for(int i = 0; i < n - 1; i++){
g.push_back(make_pair(h[i + 1].F - h[i].F, i));
}
vector<pair<ll, ll> > res = go(g);
vector<pair<ll, ll> > ret;
for(int i = 0; i < res.size(); ++i) {
ret.push_back(make_pair(h[res[i].F + 1].S, res[i].S));
ret.push_back(make_pair(h[res[i].F].S, -res[i].S));
}
return ret;
}
int get_bits(ll x) {
int ans = 0;
while (x) {
ans++;
x /= 2;
}
return ans;
}
ll mul(ll a, ll b, ll mod) {
a = (a % mod + mod) % mod;
b = (b % mod + mod) % mod;
/*if (b == 0) return 0;
if (b % 2 == 1) {
return (mul(a, b - 1, mod) + a) % mod;
}
return 2 * mul(a, b / 2, mod) % mod;*/
ll ret = 0;
for(int x = get_bits(b); x >= 0; x--){
ret *= 2;
ret %= mod;
if(b << (~x) < 0){
ret += a;
if(ret >= mod) ret -= mod;
}
}
return ret;
}
void solve() {
ll mod, mul1;
//cin >> mul1 >> mod;
cin >> mod >> mul1;
int sz = 200;
vector<pair<ll, ll> > h;
h.push_back(make_pair(1LL, sz - 1));
for(int i = 1; i < sz; ++i){
h.push_back(make_pair(mul(h[i - 1].F, mul1, mod), sz - i - 1));
}
/*for (int i = 0; i < sz; ++i) {
for (int q = 0; q < h[i].size(); ++q) {
cout << h[i][q] << " ";
}
cout << endl;
}*/
vector<pair<ll, ll> > res = go(h);
string s(sz, 'm');
string t(sz, 'm');
for(int i = 0; i < res.size(); ++i){
t[res[i].F] += res[i].S;
// cout << res[i].F << " " << res[i].S << endl;
}
cout << s << endl << t << endl;
// check
for (int i = 0; i < sz; ++i) {
if('a' <= t[i] && t[i] <= 'z') {
}else{
exit(88);
}
}
ll hs = 0, ht = 0;
for(int i = 0;i < sz;i++){
hs = mul(hs, mul1, mod) + s[i];
if(hs >= mod)hs -= mod;
ht = mul(ht, mul1, mod) + t[i];
if(ht >= mod)ht -= mod;
}
// tr(hs, ht);
if(hs != ht) exit(99);
}
int main() {
// freopen("input.txt", "r", stdin);
solve();
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0