字尾陣列 HDU 4436

2021-06-14 00:58:41 字數 989 閱讀 8524

做法:首先應用求不同子串的演算法,自然想到字尾陣列,然後就是要統計以非『0』開始的字尾。

考慮字尾  akak+1ak+2........................an            tmp[0]=ak-'0',        tmp[i]=tmp[i-1]*10+(ai-'0')    sum[i]=sum[i-1]+tmp[i];          

那麼 以        am開始的字首和就是       sum[n]-sum[m-1]-tmp[m-1]*(10^1+10^2+.....10^(n-m+1));

#include#includeconst int maxn = 411111;

const int mod = 2012;

const int r = 1565;

char s[maxn];

int sum[maxn],pos[maxn],tmp[maxn];

int beg[maxn];

int a[maxn];

struct suffix_array

void da(int r,int n,int m)

return res;

}int go(int n)

y=r*10*(cal(10,pos[sa[i]]-sa[i]+1)-1)%mod;

y*=tmp[p-1];

y=sum[pos[sa[i]]]-y;

y-=sum[p-1];

ans+=(y-x);

ans%=mod;

}return (mod+ans%mod)%mod;

}}suffix;

int main()

}suffix.da(a,n+1,128);

suffix.calheight(a,n);

int ans=suffix.go(n);

printf("%d\n",ans);

}return 0;

}

hdu4436 字尾自動機

題解 求多個字串能夠構成多少種數然後把這些數去重後加起來,字尾自動機有個性質就是路徑數就等於不同子串個數,然後怎麼把多個字串拼接呢,兩個字串中間加入乙個你不會用的字元,因為這樣可以保證我到時候路徑不會走這條 include include include include include includ...

hdu 4436 str2int 字尾自動機

hdu 4436 str2int 字尾自動機 題意 給出n個數字,數字很長,用字串讀入,長度總和為10 5。求這n個字串的所有子串 不重複 的和取模2012 解題思路 字尾自動機。因為要處理所有不同的子串,所以想到字尾自動機。將所有的串乙個個建進去,用乙個10去間隔開來。建好之後,我們要統計和了。字...

HDU 4436 str2int(字尾自動機)

題意 給出一些數字串,每個數字串可以分成若干數字,比如123可以分成1,2,3,12,23,123。求所有數字串分成的數字的集合的和。思路 字尾自動機 串之間用數字10隔開,建立自動機。節點p和數字j得到的子節點q,q cnt p cnt,q sum p sum 10 p cnt j。const i...