HDU 2328 Corporate Identity

一直WA,后来陆陆续续发现一点小错误,说多了都是泪

这里最后查找有多少个串是满足条件的时候,用map先将r里每一个字符的位置(而不是其值,值会有很多重复的)映射为其所在的串,这样就不用自己去开个hash数组了

最后查找的时候用个set判断有多少个串满足条件

#include
#include
#include
#include 
#include
using namespace std;
#define N 900010
char s[4005][205];
int r[N];
int wa[N],wb[N],wv[N],ws[N],sa[N],Rank[N],height[N];
map ma;
set se;	
int ans; 
int cmp(int *r,int a,int b,int l) {
	return r[a]==r[b]&&r[a+l]==r[b+l];
}
void da(int *r,int *sa,int n,int m){
    int i,j,p,*x=wa,*y=wb;
    for(i=0;i=0;i--) sa[--ws[x[i]]]=i;
    for(j=1,p=1;p=j) y[p++]=sa[i]-j;
        for(i=0;i=0;i--) sa[--ws[wv[i]]]=y[i];
        swap(x,y);
        for(p=1,x[sa[0]]=0,i=1;i=k) {
			if(ma.find(sa[i])!=ma.end()) {
				se.insert(ma[sa[i]]);
			}
		}
		else {
			se.clear();
			if(ma.find(sa[i])!=ma.end()) se.insert(ma[sa[i]]);
		}
		if(se.size()>=n) {
			ans=i;
			return 1;
		}
	}
	return 0;
}
int main(){
	#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
	#endif // ONLINE_JUDGE
	int n;
	while(scanf("%d",&n),n){
        for (int i=0;i>1;
			if(ok(mid,n,l)) low=mid;
			else high=mid;
		}
		if(low==0) printf("IDENTITY LOST\n");
		else {
			//printf("lfdskjaflsad");
			for(int i=0;i


你可能感兴趣的:(ACM)