首页 > 代码库 > codechef 两题
codechef 两题
前面做了这场比赛,感觉题目不错,放上来。
A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了。
其实这道题类似百度之星资格赛第三题XOR SUM,不过他求得是XOR最大值,原理类似。。
B:KMP居然写搓了,后来一直改,题目放个链接好了:http://www.codechef.com/LTIME14/problems/TASHIFT。
我么可以对B字符串复制一下,然后再对A字符串求出NEXT数组,再匹配的过程中求出匹配最大长度时的位置,
刚开始我没想到这种做法,然后是先求出NEXT数组,然后二分,具体看代码。CODECHEF好像不能赛后交,代码的正确性。。
1 T#include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set>10 #include<list>11 #define inf 0x3f3f3f12 typedef long long ll;13 using namespace std;14 char s[1234567];15 char ss[1234567];16 int next[1234567];17 int n;18 19 void kmp()20 {21 int k=-1,i=0;22 memset(next,0,sizeof(next));23 next[0]=-1;24 while (i<n)25 {26 if (k==-1||s[k]==s[i])27 next[++i]=++k;28 else k=next[k];29 }30 }31 32 int getkmp(int x)33 {34 int k=0,i=0;35 while (i<(2*n-1)&&k<x)36 {37 if (k==-1||ss[i]==s[k])38 {39 k++;i++;40 }41 else k=next[k];42 }43 if (k==x) return i-x;44 return -1;45 }46 47 48 int main()49 {50 scanf("%d",&n);51 scanf("%s%s",s,ss);52 kmp();53 int ans=0;54 for (int i=n;i<n+n-1;i++) ss[i]=ss[i-n];55 ss[n+n-1]=‘\n‘;56 int h=0,t=n;57 58 for (int o=0;o<40;o++)59 {60 int mid=(h+t)/2;61 if (getkmp(mid)!=-1) {h=mid;ans=getkmp(mid);}62 else t=mid;63 }64 printf("%d\n",ans);65 return 0;66 }
另外附百度之星XOR SUM的01字典树代码:
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 #include<string> 6 using namespace std; 7 #define N 3333333 8 int next[N][2],end[N]; 9 int pos;10 void add(int cur,int k) {11 next[pos][0]=next[pos][1]=0;12 end[pos]=0;13 next[cur][k]=pos++;14 }15 16 int cal(int x)17 {18 int cur=0;19 for (int i=30;i>=0;i--){20 int k=((1<<i)&x)?0:1;21 if (next[cur][k]) cur=next[cur][k];22 else cur=next[cur][1-k];23 }24 return end[cur];25 }26 27 int main()28 {29 int T;30 scanf("%d",&T);31 for (int o=1;o<=T;o++)32 {33 int n,m;34 scanf("%d%d",&n,&m);35 pos=1;36 memset(next[0],0,sizeof(next[0]));37 for (int i=0;i<n;i++) {38 int x;39 scanf("%d",&x);40 int cur=0;41 for (int j=30;j>=0;j--)42 {43 int k=0;44 if ((1<<j)&x) k=1;45 if (next[cur][k]==0) add(cur,k);46 cur=next[cur][k];47 }48 end[cur]=x;49 }50 printf("Case #%d:\n",o);51 for (int i=0;i<m;i++){52 int x;53 scanf("%d",&x);54 int ans=cal(x);55 printf("%d\n",ans);56 }57 }58 return 0;59 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。