首页 > 代码库 > 140725模拟赛总结
140725模拟赛总结
A:hdu4847 字符串匹配
第一想法是KMP,写了好长时间结果还TLE了-_-||,实际上用个简单的枚举判断就能解决。因为待验证的字符串"doge"很小。
写A题的时候还被输入卡了半天。
Tips1:输入至文件结尾(eof)的常用方法:
while (cin>>a) //最常用的
while (cin.getline(s,30)) //按行读入前30个字符。空格也读入
getline(cin,s) //和getline相似,
Reference:http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html
Tips2:自己的KMP还是两年前用Pascal写的......
找了个KMP模版,以后用就行:
Reference:http://www.cnblogs.com/183zyz/archive/2011/03/24/1994380.html
1 # include<stdio.h> 2 # include<string.h> 3 char P[10005],T[1000005]; 4 int next[10005],n,m; 5 void Pnex() 6 { 7 int k,q; 8 next[1]=0; 9 k=0; 10 for(q=2;q<=n;q++) 11 { 12 while(k>0 && P[k+1]!=P[q]) 13 { 14 k=next[k]; 15 } 16 if(P[k+1]==P[q]) k++; 17 next[q]=k; 18 }19 }20 int main()21 { 22 int i,t,q,num; 23 scanf("%d",&t); 24 getchar(); 25 while(t--) 26 { 27 gets(P); 28 gets(T); 29 n=strlen(P); 30 m=strlen(T); 31 for(i=n-1;i>=0;i--) 32 P[i+1]=P[i]; 33 for(i=m-1;i>=0;i--) 34 T[i+1]=T[i]; 35 Pnex(); 36 q=0; 37 num=0; 38 for(i=1;i<=m;i++) 39 { 40 while(q>0 && P[q+1]!=T[i]) 41 { 42 q=next[q]; 43 } 44 if(P[q+1]==T[i]) q++; 45 if(q==n) 46 { 47 num++; 48 q=next[q]; 49 } 50 } 51 printf("%d\n",num); 52 } 53 return 0;54 }
Tips3:补充一个更快的字符串匹配算法:Boyer-Moore算法
Reference:http://www.ruanyifeng.com/blog/2013/05/boyer-moore_string_search_algorithm.html
Tips4:补充李大神发的一个神图:
B:hdu4848 搜索+强剪枝
题目大意:图上每个点都有各自的deadline,需要在deadline之前遍历完所有的点。求最少时间
Reference:http://www.tuicool.com/articles/vERnuqZ
C:hdu4849 最短路
D:hdu4850
先留着点,本周一定要写!