Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <climits>
- #include <vector>
- #include <queue>
- #include <map>
- #include <iostream>
- using namespace std;
- typedef long long ll;
- typedef pair<int,int> pii;
- typedef vector<int> vi;
- typedef vector<vi> vvi;
- #ifdef EVAL
- #include <fstream>
- #define cin fin
- #define cout fout
- ifstream fin("input.txt");
- ofstream fout("output.txt");
- #endif
- void print_spaces(int n){
- while(n--) cout << " ";
- }
- struct nodo : map<char, nodo*>{
- char *s = 0;
- int len = 0;
- bool is_ending(){
- return size() == 0;
- }
- void debug(string msg){
- cout << msg << " : ";
- for(int i = 0; i < len; i++) cout << s[i];
- cout << '\n';
- }
- void print(int level){
- print_spaces(level);
- for(int i = 0; i < len; i++) cout << s[i];
- cout << '\n';
- for(auto &n : *this) n.second->print(level+1);
- }
- };
- struct compact_trie{
- nodo root;
- void insert(char *s, int len){
- int l = 0;
- nodo *prev;
- nodo *tmp = &root;
- while(l < len){
- //tmp->debug("sono nel nodo");
- int i = 0;
- for(; i < tmp->len && l < len; i++, l++)
- if(s[l] != tmp->s[i])
- break;
- //cout << "match di " << i << '\n';
- if(l == len && i == tmp->len) return;
- if(i < tmp->len){
- nodo *red = new nodo();
- red->len = i;
- red->s = tmp->s;
- //prev->debug("prev si presenta");
- (*prev)[tmp->s[0]] = red;
- (*red)[tmp->s[i]] = tmp;
- //red->debug("creo red");
- tmp->len -= i;
- tmp->s += i;
- //tmp->debug("ora tmp diventa");
- //cout << "splittiamo\n";
- tmp = red;
- }
- if(!tmp->count(s[l])){
- // cout << "creo un nuovo figlio di troia\n";
- // cout << "link in " << s[l] << '\n';
- (*tmp)[s[l]] = new nodo();
- (*tmp)[s[l]]->s = &s[l];
- (*tmp)[s[l]]->len = len - l;
- }
- prev = tmp;
- tmp = (*tmp)[s[l]];
- }
- }
- void print(){
- root.print(0);
- }
- };
- //dumb edition
- struct sufftree{
- compact_trie dumb;
- sufftree (string &s){
- s += '\0';
- for(int i = 0; i < s.size()-1; i++)
- dumb.insert(&s[i], s.size()-i);
- }
- void print(){
- dumb.print();
- }
- int lcp(string &s, int l){
- int r = l;
- nodo *tmp = &dumb.root;
- while(1){
- int i;
- for(i = 0; i < tmp->len && r < s.size() && tmp->s[i] == s[r]; i++, r++);
- if(r == s.size() || i != tmp->len || !tmp->count(s[r]))
- break;
- tmp = (*tmp)[s[r]];
- }
- return r - l;
- }
- };
- int main(){
- cin.sync_with_stdio(false);
- cin.tie(NULL);
- string s, t;
- getline(cin, s), getline(cin, t);
- sufftree st(t);
- //st.print();
- int done = 0;
- int ans = 0;
- while(done != s.size())
- done += st.lcp(s, done), ans++;
- cout << ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement