結果
| 問題 |
No.8014 多項式ハッシュに関する教育的な問題
|
| ユーザー |
IL_msta
|
| 提出日時 | 2015-10-29 15:10:06 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,293 bytes |
| コンパイル時間 | 1,146 ms |
| コンパイル使用メモリ | 103,492 KB |
| 実行使用メモリ | 31,008 KB |
| 最終ジャッジ日時 | 2024-09-13 04:32:05 |
| 合計ジャッジ時間 | 13,828 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | TLE * 1 |
ソースコード
#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
#include <vector>
#include <complex>
#include <set>
#include <map>
#include <stack>
#include <list>
#include <random>
/////////
#define REP(i, x, n) for(int i = x; i < n; i++)
#define rep(i,n) REP(i,0,n)
#define P(p) cout<<(p)<<endl;
#define PII pair<int,int>
/////////
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
/////////
using namespace::std;
/////////
/////////
ULL P,B;
vector< vector<ULL> > bmp(26,vector<ULL>(100001) );
ULL kake(ULL A, int n){
//A*n
ULL ret=0;
for(int bit=31;bit>=0;--bit){
ret = (ret + ret) % P;
if( n & (1 << bit) ){
ret = (ret + A) % P;
}
}
return ret;
}
void initbmp(){
bmp[0][0] = 1;
bmp[0][1] = B % P;
for(int i=2;i<100001;++i){
bmp[0][i] = ( bmp[0][i-1] * B ) % P;
}
ULL add;
for(int i=0;i<100001;++i){
add = bmp[0][i];
bmp[0][i] = kake( bmp[0][i], 97 );
for(int j=1;j<26;++j){
bmp[j][i] = ( bmp[j-1][i] + add ) % P;
}
}
}
ULL calH(string &str){
int len = str.size();
ULL ret = 0;
for(int i=0;i<len;++i){
ret = ( ret + bmp[str[i]-'a'][len-i-1] ) % P;
}
return ret;
}
ULL calH( vector<int> &v ){
int len = v.size();
ULL ret = 0;
for(int i=0;i<len;++i){
//if( 0 <= v[i] && v[i] < 26 )
{
//ret = ( ret + bmp[ v[i] ][len-i-1] ) % P;
ret = ( ret + bmp[ v[i] ][len-i-1] );
if( ret >= P ){
ret = ret % P;
}
}
}
return ret;
}
void show( vector<int> &v ){
char c;
int len = v.size();
for(int i=0;i<len;++i){
c = v[i] + 'a';
cout << c;
}
cout << '\n';
return;
}
void solve(){
cin >> P >> B;
initbmp();
ULL ah,bh;
const int Lmax = 10000;
vector<int> S(Lmax,0);
vector<int> T(Lmax,0);
random_device rnd;
mt19937 mt(rnd());
for(int i=0;i<Lmax;++i){
S[i] = (mt()%26 + 26 )%26;
}
ah = calH( S );
int i=0;
show( S );
for(;;){
for(int i=0;i<Lmax;++i){
//T[i] = (mt()%26 + 26 ) % 26;
T[i] = mt()%26;
}
bh = calH( T );
if( ah == bh ){
break;
}else{
//cout << "x";
}
}
show( T );
}
int main(void){
std::cin.tie(0);
std::ios::sync_with_stdio(false);
std::cout << std::fixed;//
cout << setprecision(16);//
//cpp
solve();
return 0;
}
IL_msta