zoukankan      html  css  js  c++  java
  • [CEOI2017]Palindromic Partitions

    [CEOI2017]Palindromic Partitions

    题目大意:

    给出一个长度为(n(nle10^6))的只包含小写字母字符串,要求你将它划分成尽可能多的小块,使得这些小块构成回文串。

    思路:

    哈希以后从两侧往里贪心,尽量取短的。

    时间复杂度(mathcal O(n))

    源代码:

    #include<cstdio>
    #include<cctype>
    #include<cstring>
    inline int getint() {
    	register char ch;
    	while(!isdigit(ch=getchar()));
    	register int x=ch^'0';
    	while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
    	return x;
    }
    typedef unsigned long long uint64;
    const int N=1e6+2;
    const uint64 base=33;
    char s[N];
    uint64 pwr[N],hash[N];
    inline uint64 calc(const int &l,const int &r) {
    	return hash[r]-hash[l-1]*pwr[r-l+1];
    }
    int main() {
    	for(register int T=getint();T;T--) {
    		scanf("%s",&s[1]);
    		const int n=strlen(&s[1]);
    		for(register int i=pwr[0]=1;i<=n;i++) {
    			pwr[i]=pwr[i-1]*base;
    			hash[i]=hash[i-1]*base+s[i]-'a';
    		}
    		int last=0,ans=0;
    		for(register int i=1;i<=n/2;i++) {
    			if(calc(last+1,i)==calc(n-i+1,n-last)) {
    				last=i;
    				ans+=2;
    			}
    		}
    		if(last*2<n) ans++;
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    SHELL基础
    阿里
    Ansible基础
    js实现的跳转页面方法实现汇总
    绕过js-sdk,微信转发的时候在标题添加时间和地点。
    wechat-js-sdk
    js调用百度地图api实现定位
    微创网站工作总结:用错地方的资源
    项目进行时—整理
    js实现双击改变文本内容
  • 原文地址:https://www.cnblogs.com/skylee03/p/9686537.html
Copyright © 2011-2022 走看看