Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 10007
- #define ALPHA 26
- using namespace std;
- struct node{
- struct node* word[ALPHA];
- struct node* link;
- bool end, mark;
- int id_c;
- vector<int> id;
- node(int id) : id_c(id) {
- fill(word, word+ALPHA, (node*)0);
- end = false;
- mark = false;
- }
- };
- node* head;
- int ans[MAX];
- vector<string> palavras;
- bool compare(string a, string b) {
- return a.size() < b.size();
- }
- void add(string s, int id){
- node* current = head;
- int biggest = 0;
- for(int i = 0; i < s.size(); i++){
- int letra = s[i]-'a';
- if(!current->word[letra]) current->word[letra] = new node(id);
- if(current->word[letra]->end){
- int maior = 0;
- for(int x = 0; x < current->word[letra]->id.size(); x++){
- maior = max(ans[current->word[letra]->id[x]], maior);
- }
- biggest = max(biggest, maior + 1);
- }
- current = current->word[letra];
- }
- current->end = true;
- current->id.push_back(id);
- ans[id] += biggest;
- }
- void bfs(int id){
- queue<node*> q;
- int biggest = 0;
- for(int i = 0; i < ALPHA; i++){
- if(head->word[i]){
- head->word[i]->link = head;
- q.push(head->word[i]);
- }else head->word[i] = head;
- }
- while(!q.empty()){
- node* pai = q.front();
- q.pop();
- for(int i = 0; i < ALPHA; i++){
- if(pai->word[i]){
- node* filho = pai->link;
- while(!filho->word[i]) filho = filho->link;
- filho = filho->word[i];
- pai->word[i]->link = filho;
- q.push(pai->word[i]);
- pai->word[i]->mark = true;
- //cout << (char)('a'+i) << " --> " << filho->id_c << endl;
- if(filho->end){
- int maior = 0;
- for(int x = 0; x < filho->id.size(); x++){
- maior = max(ans[filho->id[x]], maior);
- }
- biggest = (maior + 1, biggest);
- }
- }
- }
- }
- ans[id] += biggest;
- }
- int main(){
- int qnt; cin >> qnt;
- for(int i = 0; i <= qnt; i++) ans[i] = 0;
- head = new node(0);
- for(int i = 1; i <= qnt; i++){
- string s; cin >> s;
- palavras.push_back(s);
- }
- sort(palavras.begin(), palavras.end(), compare);
- for(int i = 1; i <= qnt; i++){
- cout << "vou add\n";
- add(palavras[i-1], i);
- cout << "adionei\n";
- bfs(i);
- cout << "fiz os links\n";
- cout << palavras[i-1] << endl;
- for(int j = 0; j <= qnt; j++) cout << ans[j] << " ";
- cout << endl;
- }
- int resp = 0;
- for(int i = 0; i <= qnt; i++) resp = max(ans[i], resp);
- cout << resp << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment