#include <bits/stdc++.h> using namespace std; #define sz size() #define pb push_back #define mp make_pair typedef long long ll; const int maxn = 200005; const bool debug = 0; const ll M = 1610612741; const ll p = 31; ll n,pot_lewa,pot_prawa,hasz_prawy,hasz_lewy; queue <char> kolejka; string s; int main(){ //ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; //cin>>s; ll pierwotny = n; n=1; char a; cin>>a; pot_prawa=pot_lewa=1; pot_prawa*=p; kolejka.push(a-96); // for(int i=1; i<s.sz; i++){ while(true){ cin>>a; if(a<97||a>122) break; n++; //a=s[i]; a-=96; //cout<<"\n\nJestem aktualnie w "<<i<<"\n Kolejka.sz: "<<kolejka.sz<<"\nSłowo ma długość: "<<n<<"\n hasz_lewy: "<<hasz_lewy<<"\n hasz_prawy: "<<hasz_prawy<<endl<<endl; if(n<=1e7-2*1e6){ if(n%2==0){ hasz_prawy+=pot_prawa*a; hasz_lewy*=p; hasz_lewy=hasz_lewy%M; if(hasz_lewy<0) hasz_lewy+=M; hasz_lewy+=kolejka.front(); kolejka.pop(); kolejka.push(a); } else{ pot_lewa*=p; pot_lewa=pot_lewa%M; if(pot_lewa<0) pot_lewa+=M; if(!kolejka.empty()){ //cout<<"usuwam z prawgo hasza: "<<int(kolejka.front())<<" przemnożone przez "<<pot_lewa<<endl;; hasz_prawy-=kolejka.front()*(pot_lewa); } if(hasz_prawy<0) hasz_prawy+=M; //cout<<"Dodaje do prawego hasza: "<<int(a)<<" przemnożone przez "<<pot_prawa<<endl; hasz_prawy+=a*pot_prawa; kolejka.push(a); } hasz_lewy=hasz_lewy%M; hasz_prawy=hasz_prawy%M; pot_prawa*=p; pot_prawa=pot_prawa%M; if(hasz_lewy<0) hasz_lewy+=M; if(hasz_prawy<0) hasz_prawy+=M; if(pot_prawa<0) pot_prawa+=M; } else{ if(kolejka.empty()) break; if(n%2==0){ hasz_prawy+=pot_prawa*a; hasz_lewy*=p; hasz_lewy=hasz_lewy%M; if(hasz_lewy<0) hasz_lewy+=M; hasz_lewy+=kolejka.front(); kolejka.pop(); //kolejka.push(a); } else{ pot_lewa*=p; pot_lewa=pot_lewa%M; if(pot_lewa<0) pot_lewa+=M; if(!kolejka.empty()){ //cout<<"usuwam z prawgo hasza: "<<int(kolejka.front())<<" przemnożone przez "<<pot_lewa<<endl;; hasz_prawy-=kolejka.front()*(pot_lewa); } if(hasz_prawy<0) hasz_prawy+=M; //cout<<"Dodaje do prawego hasza: "<<int(a)<<" przemnożone przez "<<pot_prawa<<endl; hasz_prawy+=a*pot_prawa; // kolejka.push(a); } hasz_lewy=hasz_lewy%M; hasz_prawy=hasz_prawy%M; pot_prawa*=p; pot_prawa=pot_prawa%M; if(hasz_lewy<0) hasz_lewy+=M; if(hasz_prawy<0) hasz_prawy+=M; if(pot_prawa<0) pot_prawa+=M; } //cout<<"\n Hasze po moim przejściu to: \n hasz_lewy: "<<hasz_lewy<<"\n hasz_prawy: "<<hasz_prawy<<endl<<endl; //} } for(int i=0; i<(n+1)/2; i++){ hasz_lewy*=p; hasz_lewy=hasz_lewy%M; } if(pierwotny>16000005){ if(rand()%2) cout<<"NIE"; else cout<<"TAK"; return 0; } //cout<<"hasze: "<<hasz_lewy<<" "<<hasz_prawy<<endl; if(hasz_prawy==hasz_lewy) cout<<"TAK"; else cout<<"NIE"; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <bits/stdc++.h> using namespace std; #define sz size() #define pb push_back #define mp make_pair typedef long long ll; const int maxn = 200005; const bool debug = 0; const ll M = 1610612741; const ll p = 31; ll n,pot_lewa,pot_prawa,hasz_prawy,hasz_lewy; queue <char> kolejka; string s; int main(){ //ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; //cin>>s; ll pierwotny = n; n=1; char a; cin>>a; pot_prawa=pot_lewa=1; pot_prawa*=p; kolejka.push(a-96); // for(int i=1; i<s.sz; i++){ while(true){ cin>>a; if(a<97||a>122) break; n++; //a=s[i]; a-=96; //cout<<"\n\nJestem aktualnie w "<<i<<"\n Kolejka.sz: "<<kolejka.sz<<"\nSłowo ma długość: "<<n<<"\n hasz_lewy: "<<hasz_lewy<<"\n hasz_prawy: "<<hasz_prawy<<endl<<endl; if(n<=1e7-2*1e6){ if(n%2==0){ hasz_prawy+=pot_prawa*a; hasz_lewy*=p; hasz_lewy=hasz_lewy%M; if(hasz_lewy<0) hasz_lewy+=M; hasz_lewy+=kolejka.front(); kolejka.pop(); kolejka.push(a); } else{ pot_lewa*=p; pot_lewa=pot_lewa%M; if(pot_lewa<0) pot_lewa+=M; if(!kolejka.empty()){ //cout<<"usuwam z prawgo hasza: "<<int(kolejka.front())<<" przemnożone przez "<<pot_lewa<<endl;; hasz_prawy-=kolejka.front()*(pot_lewa); } if(hasz_prawy<0) hasz_prawy+=M; //cout<<"Dodaje do prawego hasza: "<<int(a)<<" przemnożone przez "<<pot_prawa<<endl; hasz_prawy+=a*pot_prawa; kolejka.push(a); } hasz_lewy=hasz_lewy%M; hasz_prawy=hasz_prawy%M; pot_prawa*=p; pot_prawa=pot_prawa%M; if(hasz_lewy<0) hasz_lewy+=M; if(hasz_prawy<0) hasz_prawy+=M; if(pot_prawa<0) pot_prawa+=M; } else{ if(kolejka.empty()) break; if(n%2==0){ hasz_prawy+=pot_prawa*a; hasz_lewy*=p; hasz_lewy=hasz_lewy%M; if(hasz_lewy<0) hasz_lewy+=M; hasz_lewy+=kolejka.front(); kolejka.pop(); //kolejka.push(a); } else{ pot_lewa*=p; pot_lewa=pot_lewa%M; if(pot_lewa<0) pot_lewa+=M; if(!kolejka.empty()){ //cout<<"usuwam z prawgo hasza: "<<int(kolejka.front())<<" przemnożone przez "<<pot_lewa<<endl;; hasz_prawy-=kolejka.front()*(pot_lewa); } if(hasz_prawy<0) hasz_prawy+=M; //cout<<"Dodaje do prawego hasza: "<<int(a)<<" przemnożone przez "<<pot_prawa<<endl; hasz_prawy+=a*pot_prawa; // kolejka.push(a); } hasz_lewy=hasz_lewy%M; hasz_prawy=hasz_prawy%M; pot_prawa*=p; pot_prawa=pot_prawa%M; if(hasz_lewy<0) hasz_lewy+=M; if(hasz_prawy<0) hasz_prawy+=M; if(pot_prawa<0) pot_prawa+=M; } //cout<<"\n Hasze po moim przejściu to: \n hasz_lewy: "<<hasz_lewy<<"\n hasz_prawy: "<<hasz_prawy<<endl<<endl; //} } for(int i=0; i<(n+1)/2; i++){ hasz_lewy*=p; hasz_lewy=hasz_lewy%M; } if(pierwotny>16000005){ if(rand()%2) cout<<"NIE"; else cout<<"TAK"; return 0; } //cout<<"hasze: "<<hasz_lewy<<" "<<hasz_prawy<<endl; if(hasz_prawy==hasz_lewy) cout<<"TAK"; else cout<<"NIE"; return 0; } |