zoukankan      html  css  js  c++  java
  • 后缀自动机学习

    1. hihocoder #1441 : 后缀自动机一·基本概念

    按照后缀自动机概念模拟即可, 复杂度$O(n^3logn)$.

    #include <iostream>
    #include <map>
    #include <string>
    #include <set>
    using namespace std;
    
    const int N = 111;
    int n, cnt;
    string s;
    map<string,set<int> > suf_to_endpos;
    map<set<int>,int> endpos_id;
    map<string,int> suf_id;
    set<string> st[N];
    string longest[N], shortest[N];
    set<int> endpos[N];
    
    int getID(set<int> &s) {
    	if (endpos_id.count(s)) return endpos_id[s];
    	endpos[++cnt] = s;
    	return endpos_id[s] = cnt;
    } 
    
    int main() {
    	cin>>s>>n;
    	for (int i=0; i<s.size(); ++i) {
    		for (int j=1; i+j<s.size(); ++j) {
    			suf_to_endpos[s.substr(i,j)].insert(i+j);
    		}
    	}
    	for (auto &t:suf_to_endpos) { 
    		int id = getID(t.second);
    		string suf = t.first;
    		st[id].insert(suf);
    		suf_id[suf] = id;
    		if (longest[id].empty()) longest[id] = shortest[id] = suf;
    		else {
    			if (suf.size()>longest[id].size()) longest[id] = suf;
    			if (suf.size()<shortest[id].size()) shortest[id] = suf;
    		}
    	}
    	while (n--) {
    		cin>>s;
    		int id = suf_id[s];
    		cout<<shortest[id]<<' '<<longest[id];
    		for (auto &&t:endpos[id]) cout<<' '<<t;
    		cout<<endl;
    	}
    }
    

    2. hihocoder #1445 : 后缀自动机二·重复旋律5

  • 相关阅读:
    作业2(5)
    作业2(7)
    作业2(4)
    作业2(3)
    作业2(1)
    作业3(5)
    作业3(6)
    实验7综合练习(4)
    实验7综合练习(2)
    计算成绩
  • 原文地址:https://www.cnblogs.com/uid001/p/10953606.html
Copyright © 2011-2022 走看看