結果
問題 | No.3014 多項式ハッシュに関する教育的な問題 |
ユーザー | IL_msta |
提出日時 | 2015-10-29 15:10:06 |
言語 | C++11 (gcc 11.4.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 |
(要ログイン)
ソースコード
#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; }