UVA - 12206 Stammering Aliens (hash)
来源:互联网 发布:南风知我意txt百度云 编辑:程序博客网 时间:2024/05/21 22:57
这题其实很容易想到2分长度,关键是2分后,怎么判断出现最多次的串是否》=m次了。这里需要用到hash来处理。 对于一个字符串 H[i] =H[i+1]*131+s[i] ;其中 H[n]=0;那么对于一个长度为L的串 ,hanh[i,l]=H[i]-H[i+L]*x^L ; 这样记录每个字符串的hash值,然后再处理起来就比较简单了。
VIEW CODE
#include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<map>#include<vector>#include<set>#include<ctime>#include<stdlib.h>using namespace std;const int mmax= 1000010;const int mod=1000000007;const int inf=0x3fffffff;using namespace std;typedef long long LL;typedef unsigned long long ULL;ULL H[mmax];map<ULL,int>q;int m;char str[mmax];ULL Pow[mmax];void build_ha(){ int n=strlen(str); H[n]=0; for(int i=n-1;i>=0;i--) H[i]=H[i+1]*131+str[i];}ULL Ha[mmax];bool ok(int k){ int n=strlen(str); for(int i=0;i+k-1<n;i++) { ULL tmp=H[i]-H[i+k]*Pow[k]; Ha[i]=tmp; } sort(Ha,Ha+n-k+1); int cnt=0; for(int i=0;i<n-k+1;i++) { if( i && Ha[i]==Ha[i-1]) cnt++; else { if(cnt>=m) return 1; cnt=1; } } if(cnt>=m) return 1; return 0;}int main(){ Pow[0]=1; for(int i=1;i<mmax;i++) Pow[i]=Pow[i-1]*131; while(cin>>m&&m) { scanf("%s",str); int n=strlen(str); int l=1,r=n+1; build_ha(); while(l<r) { int mid=(l+r)>>1; if(ok(mid)) l=mid+1; else r=mid; } int ans=r-1; if(!ans) { puts("none"); continue; } int e; q.clear(); for(int i=0;i+ans-1<n;i++) { ULL tmp=H[i]-H[i+ans]*Pow[ans]; q[tmp]++; if(q[tmp]>=m) e=i; } printf("%d %d\n",ans,e); } return 0;}
0 0
- UVA - 12206 Stammering Aliens (hash)
- UVA 12206 - Stammering Aliens(Hash+LCP)
- UVA 12206 Stammering Aliens(字符串hash)
- uva 12206 - Stammering Aliens(哈希)
- UVA 12206 - Stammering Aliens(后缀数组)
- UVA 12206 Stammering Aliens(后缀数组+二分)
- la4513 Stammering Aliens 字符串hash
- UVA 12206 Stammering Aliens(基于哈希值的LCP算法)
- LA - 4513 - Stammering Aliens(Hash + 二分)
- hdu 4080 Stammering Aliens 二分 hash
- LA 4513 Stammering Aliens 字符串hash
- 【Hash求LCP】HDU4080[Stammering Aliens]题解
- Uvalive 4513 Stammering Aliens(字符串Hash)
- UVALive 4513 Stammering Aliens hash+二分
- hdu4080 Stammering Aliens(二分+字符串hash)
- LA 4513 Stammering Aliens(字符串hash)
- Uva LA 4513 Stammering Aliens(Follow the example, solve by lcp using hash)
- 重复出现超过m次的最长的子串的最大下标 后缀数组或Hash+LCP UVA 12206 - Stammering Aliens
- C++输出有效数字位数
- Linux时间子系统之四:定时器的引擎:clock_event_device
- EL表达式
- How to Segment EBAY Mobile Buyers?
- android spinner 修改字体颜色和大小
- UVA - 12206 Stammering Aliens (hash)
- dom4j读写xml简单demo
- 510D Fox And Jumping(dp+gcd)
- Win7环境变量下的用户变量和系统变量的区别
- Linux时间子系统之五:低分辨率定时器的原理和实现
- uva 11218 KTV(DFS+回溯)
- 使用Redis构建消息队列和发布订阅系统
- Account Sharing Classification Model
- 将博客搬至CSDN