ACM字符串题目及源代码.docx
- 文档编号:4324044
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:39
- 大小:27.36KB
ACM字符串题目及源代码.docx
《ACM字符串题目及源代码.docx》由会员分享,可在线阅读,更多相关《ACM字符串题目及源代码.docx(39页珍藏版)》请在冰豆网上搜索。
ACM字符串题目及源代码
目录
Hdu1403最长公共子串2
Pku1743不可以重复的最长重复子串4
Pku3261可以重叠k次的最长重复子串7
Spoj694不相同的子串的个数10
Hdu3068最长回文(扩展kmp)13
Timus1297最长回文子串后缀数组解法16
Pku3693重复次数最多的连续重复子串20
nlogn后缀数组TLE22
Kmp24
SPOJ687重复次数最多的连续重复子串25
Pku3693同上题一样原理29
Pku3415长度不小于k的公共子串的个数29
Hdu1403最长公共子串
SampleInput
banana
cianaic
SampleOutput
3
#include
#include
#include
usingnamespacestd;
#definemaxn200005
intwa[maxn],wb[maxn],wv[maxn],wh[maxn];
intcmp(int*r,inta,intb,intl){returnr[a]==r[b]&&r[a+l]==r[b+l];}
voidda(char*r,int*sa,intn,intm)
{
inti,j,p,*x=wa,*y=wb,*t;
for(i=0;i for(i=0;i for(i=1;i for(i=n-1;i>=0;i--)sa[--wh[x[i]]]=i; for(j=1,p=1;p { if(j>n)break; for(p=0,i=n-j;i for(i=0;i for(i=0;i for(i=0;i for(i=0;i for(i=1;i for(i=n-1;i>=0;i--)sa[--wh[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i x[sa[i]]=cmp(y,sa[i-1],sa[i],j)? p-1: p++; } return; } intrank[maxn],height[maxn]; voidcalheight(char*r,int*sa,intn) { inti,j,k=0; for(i=1;i for(i=0;i for(k? k--: 0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); return; } intjudge(inti,intn,int*sa) { intt1,t2; if(sa[i]<=n)t1=1; elset1=0; if(sa[i-1]<=n)t2=1; elset2=0; if(t1! =t2)return1; elsereturn0; } charr[maxn]; chartmp[maxn]; intsa[maxn]; intmain() { inti,j,n,m; //freopen("a.txt","r",stdin); while(scanf("%s%s",&r,&tmp)! =EOF) { n=strlen(r); m=strlen(tmp); r[n]=''; for(i=0,j=n+1;i n=n+m+1; ///for(i=0;i da(r,sa,n,'{'); calheight(r,sa,n); intmax=0; //for(i=0;i for(i=1;i printf("%d\n",max); } return0; } Pku1743不可以重复的最长重复子串 TimeLimit: 1000MS MemoryLimit: 30000K Description AmusicalmelodyisrepresentedasasequenceofN(1<=N<=20000)notesthatareintegersintherange1..88,eachrepresentingakeyonthepiano.Itisunfortunatebuttruethatthisrepresentationofmelodiesignoresthenotionofmusicaltiming;but,thisprogrammingtaskisaboutnotesandnottimings. Manycomposersstructuretheirmusicaroundarepeating&qout;theme&qout;,which,beingasubsequenceofanentiremelody,isasequenceofintegersinourrepresentation.Asubsequenceofamelodyisathemeifit: ∙isatleastfivenoteslong ∙appears(potentiallytransposed--seebelow)againsomewhereelseinthepieceofmusic ∙isdisjointfrom(i.e.,non-overlappingwith)atleastoneofitsotherappearance(s) Transposedmeansthataconstantpositiveornegativevalueisaddedtoeverynotevalueinthethemesubsequence. Givenamelody,computethelength(numberofnotes)ofthelongesttheme. Onesecondtimelimitforthisproblem'ssolutions! Input Theinputcontainsseveraltestcases.ThefirstlineofeachtestcasecontainstheintegerN.Thefollowingnintegersrepresentthesequenceofnotes. Thelasttestcaseisfollowedbyonezero. Output Foreachtestcase,theoutputfileshouldcontainasinglelinewithasingleintegerthatrepresentsthelengthofthelongesttheme.Iftherearenothemes,output0. SampleInput 30 2527303439455260697969605245393430262218 82787470666764606580 0 SampleOutput 5 #include #include #include usingnamespacestd; #definemaxn20010 intwa[maxn],wb[maxn],wv[maxn],wh[maxn]; intcmp(int*r,inta,intb,intl){returnr[a]==r[b]&&r[a+l]==r[b+l];} voidda(int*r,int*sa,intn,intm) { inti,j,p,*x=wa,*y=wb,*t; for(i=0;i for(i=0;i for(i=1;i for(i=n-1;i>=0;i--)sa[--wh[x[i]]]=i; for(j=1,p=1;p { if(j>n)break; for(p=0,i=n-j;i for(i=0;i for(i=0;i for(i=0;i for(i=0;i for(i=1;i for(i=n-1;i>=0;i--)sa[--wh[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i x[sa[i]]=cmp(y,sa[i-1],sa[i],j)? p-1: p++; } return; } intrank[maxn],height[maxn]; voidcalheight(int*r,int*sa,intn) { inti,j,k=0; for(i=1;i for(i=0;i for(k? k--: 0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); return; } intr[maxn]; intsa[maxn]; boolGet(intk,intn) { inti,mmin=sa[0],mmax=sa[0]; for(i=1;i if(height[i] else{ mmin=min(mmin,sa[i]); mmax=max(mmax,sa[i]); if(mmax-mmin>=k)return1; } } return0; } intx[maxn]; intmain() { inti,n; //freopen("a.txt","r",stdin); while(scanf("%d",&n)&&n) { for(i=0;i if(n==1) { printf("0\n"); continue; } for(i=0;i n--; da(r,sa,n,88+88); calheight(r,sa,n); intleft=0,right=n/2; intans=0; while(left<=right) { intmid=(left+right)/2; if(mid>=0&&Get(mid,n)) { ans=mid; left=mid+1; } elseright=mid-1; } if(ans+1<5)printf("0\n"); elseprintf("%d\n",ans+1); } return0; } Pku3261可以重叠k次的最长重复子串 TimeLimit: 5000MS MemoryLimit: 65536K TotalSubmissions: 4486 Accepted: 1904 CaseTimeLimit: 2000MS Description FarmerJohnhasnoticedthatthequalityofmilkgivenbyhiscowsvariesfromdaytoday.Onfurtherinvestigation,hediscoveredthatalthoughhecan'tpredictthequalityofmilkfromonedaytothenext,therearesomeregularpatternsinthedailymilkquality. Toperformarigorousstudy,hehasinventedacomplexclassificationschemebywhicheachmilksampleisrecordedasanintegerbetween0and1,000,000inclusive,andhasrecordeddatafromasinglecowoverN(1≤N≤20,000)days.HewishestofindthelongestpatternofsampleswhichrepeatsidenticallyatleastK(2≤K≤N)times.Thismayincludeoverlappingpatterns--12323231repeats2323twice,forexample. HelpFarmerJohnbyfindingthelongestrepeatingsubsequenceinthesequenceofsamples.ItisguaranteedthatatleastonesubsequenceisrepeatedatleastKtimes. Input Line1: Twospace-separatedintegers: NandK Lines2..N+1: Nintegers,oneperline,thequalityofthemilkondayiappearsontheithline. Output Line1: Oneinteger,thelengthofthelongestpatternwhichoccursatleastKtimes SampleInput 82 1 2 3 2 3 2 3 1 SampleOutput 4 #include #include #include usingnamespacestd; #definemaxn1000010 intwa[maxn],wb[maxn],wv[maxn],wh[maxn]; intcmp(int*r,inta,intb,intl){returnr[a]==r[b]&&r[a+l]==r[b+l];} voidda(int*r,int*sa,intn,intm) { inti,j,p,*x=wa,*y=wb,*t; for(i=0;i for(i=0;i for(i=1;i for(i=n-1;i>=0;i--)sa[--wh[x[i]]]=i; for(j=1,p=1;p { if(j>=n)break; for(p=0,i=n-j;i for(i=0;i for(i=0;i for(i=0;i for(i=0;i for(i=1;i for(i=n-1;i>=0;i--)sa[--wh[wv[i]]]=y[i]; for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i x[sa[i]]=cmp(y,sa[i-1],sa[i],j)? p-1: p++; } return; } intr[maxn]; intsa[maxn]; intrank[maxn],height[maxn]; voidcalheight(int*r,int*sa,intn) { inti,j,k=0; for(i=0;i for(i=0;i if(rank[i]-1>=0) for(k? k--: 0,j=sa[rank[i]-1];r[i+k]==r[j+k]&&i+k return; } boolGet(intk,intn,intt) { inti,num=1; for(i=1;i { if(height[i] { num=1; } else { num++; if(num>=t)return1; } } return0; } intx[maxn]; voidceshi(intn) { inti; for(i=0;i for(i=0;i for(i=0;i } intmain() { inti,n,k; //freopen("a.txt","r",stdin); while(scanf("%d%d",&n,&k)! =EOF) { for(i=0;i da(r,sa,n,1000001); calheight(r,sa,n); //ceshi(n); intleft=0,right=n; intans=0; while(left<=right) { intmid=(left+right)/2; if(mid>=0&&Get(mid,n,k)) { ans=mid; left=mid+1; } elseright=mid-1; } printf("%d\n",ans); } return0; } Spoj694不相同的子串的个数 Givenastring,weneedtofindthetotalnumberofitsdistinctsubstrings. Input T-numberoftestcases.T<=20; Eachtestcaseconsistsofonestring,whoselengthis<=1000 Output Foreachtestcaseoutputonenumbersayingthenumberofdistinctsubstrings. Example SampleInput: 2 CCCCC ABABA SampleOutput: 5 9 ExplanationforthetestcasewithstringABABA: len=1: A,B len=2: AB,BA len=3: ABA,BAB len=4: ABAB,BABA len=5: ABABA Thus,totalnumberofdistinctsubstringsis9. #include #include #include usingnamespacestd; #definemaxn1000010 intwa[maxn],wb[maxn],wv[maxn],wh[maxn]; intcmp(int*r,inta,intb,intj,intn) { intx=r[a+j]; inty=r[b+j]; if(a+j>=n)x=-1; if(b+j>=n)y=-1; returnr[a]==r[b]&&x==y; } voidda(int*r,int*sa,intn,intm) { inti,j,p,*x=wa,*y=wb,*t; for(i=0;i for(i=0;i for(i=1;i for(i=n-1;i>=0;i--)sa[--wh[x[i]]]=i; for(j=1,p=1;p { //printf("X: "); //for(i=0;i if(j>=n)break; for(p=0,i=n-j;i for(i=0;i //printf("Y: ");
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 字符串 题目 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)