2019HDU杭电多校第二场 HDU 6599 I Love Palindrome String I题 回文树

以下 回文树板子

const int maxn = 100005;// n(空间复杂度o(n*ALP)),实际开n即可
const int ALP = 26;
 
struct PAM{ // 每个节点代表一个回文串
    int next[maxn][ALP]; // next指针,参照Trie树
    int fail[maxn]; // fail失配后缀链接
    int cnt[maxn]; // 此回文串出现个数
    int num[maxn];
    int len[maxn]; // 回文串长度
    int s[maxn]; // 存放添加的字符
    int last; //指向上一个字符所在的节点,方便下一次add
    int n; // 已添加字符个数
    int p; // 节点个数
 
    int newnode(int w){ // 初始化节点,w=长度
        for(int i=0;i<ALP;i++)
            next[p][i] = 0;
        cnt[p] = 0;
        num[p] = 0;
        len[p] = w;
        return p++;
    }
    void init(){
        p = 0;
        newnode(0);
        newnode(-1);
        last = 0;
        n = 0;
        s[n] = -1; // 开头放一个字符集中没有的字符,减少特判
        fail[0] = 1;
    }
    int get_fail(int x){ // 和KMP一样,失配后找一个尽量最长的
        while(s[n-len[x]-1] != s[n]) x = fail[x];
        return x;
    }
    void add(int c){
        c -= 'a';
        s[++n] = c;
        int cur = get_fail(last);
        if(!next[cur][c]){
            int now = newnode(len[cur]+2);
            fail[now] = next[get_fail(fail[cur])][c];
            next[cur][c] = now;
            num[now] = num[fail[now]] + 1;
        }
        last = next[cur][c];
        cnt[last]++;
    }
    void count(){
        // 最后统计一遍每个节点出现个数
        // 父亲累加儿子的cnt,类似SAM中parent树
        // 满足parent拓扑关系
        for(int i=p-1;i>=0;i--)
            cnt[fail[i]] += cnt[i];
    }
}pam;

这道题 整段回文 和 前半段回文 就看出 前后是一样的 hash判断就好

#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull; 
const int maxn = 300005;// n(?????o(n*ALP)),???n??
const int ALP = 27;
string st;
ull ha[maxn],pp[maxn];
int ans[maxn];

int get_hash(int l,int r){
    if(l == 0) return ha[r];
    return ha[r]-ha[l-1]*pp[r-l+1];
}

bool chk(int l,int r){
    int len=r-l+1;
    int mid=(l+r)>>1;
    if(len&1) return get_hash(l,mid)==get_hash(mid,r);
    else return get_hash(l,mid)==get_hash(mid+1,r);
}
 
struct PAM{ 
    int next[maxn][ALP]; 
    int fail[maxn]; 
    int cnt[maxn]; 
    int num[maxn];
    int len[maxn]; 
    int s[maxn]; 
    int last;
    int n; 
    int p; 
    int idx[maxn * ALP];
    int newnode(int w){ 
        for(int i=0;i<ALP;i++)
            next[p][i] = 0;
        cnt[p] = 0;
        num[p] = 0;
        len[p] = w;
        return p++;
    }
    void init(){
        p = 0;
        newnode(0);
        newnode(-1);
        last = 0;
        n = 0;
        s[n] = -1;
        fail[0] = 1;
    }
    int get_fail(int x){ 
        while(s[n-len[x]-1] != s[n]) x = fail[x];
        return x;
    }
    void add(int c){
        c -= 'a';
        s[++n] = c;
        int cur = get_fail(last);
        if(!next[cur][c]){
            int now = newnode(len[cur]+2);
            fail[now] = next[get_fail(fail[cur])][c];
            next[cur][c] = now;
            num[now] = num[fail[now]] + 1;
        }
        last = next[cur][c];
        cnt[last]++;
        idx[last] = n;
    }
    void count(){
        for(int i=p-1;i>=0;i--)
        	  cnt[fail[i]] += cnt[i];
		for(int i = 2; i < p ;i ++ ) {
			if(chk(idx[i] - len[i], idx[i] - 1)) {
				for(int j = idx[i] - len[i]; j < idx[i];j ++) cout << st[j] ;cout << endl;
				ans[len[i]] += cnt[i];
			}
		}
    }
}pam;

int main(){
	pp[0] = 1;
	for(int i = 1; i < maxn; i ++) pp[i] = pp[i - 1] * 131;
	while(cin >> st) {
		int len = st.size();
		for(int i = 0; i <= len; i ++) ans[i] = 0;
		pam.init();
		for(int i = 0; i < len; i ++) pam.add(st[i]);

		ha[0] = st[0];
		for(int i = 1; i < len; i ++) 
			ha[i] = ha[i - 1] * 131 + st[i];
		pam.count();
		for(int i = 1; i <= len; i ++) {
			if(i != 1) cout << " ";
			cout << ans[i];
		}
		cout << endl;
	}
	return 0;
	
} 
数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值