Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "iostream"
- #include "vector"
- #include <string>
- #include <set>
- using namespace std;
- const int A = 1029;
- const long long B = 10e18+7;
- const long long C = 10e9+7;
- typedef vector<long long> vi;
- pair<long long , long long > get_sub_hash(vector<long long > h, vector<long long> p, long long l, long long r) {
- if (l==0)
- return {h[r]%C, h[r]%B};
- long long pre_res = (h[r]-h[l-1]*p[r-l+1]);
- return {pre_res%C, pre_res%B};
- }
- pair<vi, vi> hash_string(string s) {
- int n=s.length();
- vector<long long > h(n);
- vector<long long > p(n);
- h[0] = s[0];
- p[0] = 1;
- for (int i=1; i<n; i++) {
- h[i] = ((h[i-1]*A+s[i]) % B);
- p[i] = ((p[i-1]*A) % B);
- }
- return {h, p};
- }
- int main() {
- set<pair<long long ,long long>> nums;
- string s;
- getline(cin, s);
- int n=s.length();
- vector<long long> h, p;
- pair<vi, vi> hp = hash_string(s);
- for (int l=0; l<n; l++) {
- for (int r=l; r<n; r++) {
- nums.insert(get_sub_hash(hp.first, hp.second, l, r));
- }
- }
- cout << nums.size() << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment