zoukankan      html  css  js  c++  java
  • Seek the Name, Seek the Fame

    POJ

    题意:给定若干个长度小于等于(400000)的字符串,在每个字符串中求出既是前缀又是后缀的子串长度.

    分析:字符串哈希记录前缀值,然后直接枚举长度,分别表示出前缀和后缀的哈希值,并判断是否相等即可.

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    #define ll long long
    #define ull long long
    using namespace std;
    const int N=400005;
    char s[N];int p=1e9+7;
    ull sum[N],Base[N];
    int main(){
    	Base[0]=1;for(int i=1;i<N;++i)Base[i]=Base[i-1]*p;
    	while(~scanf("%s",s+1)){
    		int n=strlen(s+1);
    		for(int i=1;i<=n;++i)
    			sum[i]=sum[i-1]*p+(ull)s[i]-'a'+1;
    		for(int i=1;i<=n;++i){
    			if(sum[i]==sum[n]-sum[n-i]*Base[i])printf("%d ",i);
    		}
    		printf("
    ");
    	}
        return 0;
    }
    
    
  • 相关阅读:
    【NOIP2017】奶酪
    【NOIP2017】时间复杂度
    【NOIP2005】过河
    【洛谷习题】垃圾陷阱
    dfs序
    bzoj2441 小W的问题
    彩色迷宫
    蛋糕与蛋挞
    树上倍增
    因数个数定理
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11603186.html
Copyright © 2011-2022 走看看