这三题c语言关于acm方面的题目,求帮忙解答一下,谢谢哈!!

如题所述

你这些题数据范围其实都可以改大的= =,现在这个范围就比较水了...

其实我第三题没有看清楚= =,太模糊了...

 

第一题可以字符串Hash,或者用个map什么的,然后求出每个连续的长度为m的子串,丢到hash里面去看出没出现过就好了。总共最多n个子串嘛...

第二题,n<=1000,那么n^2就可以过了,所以你可以先求一个前缀异或和,然后枚举左右端点L,R,然后[L,R]的异或和=s[R]^s[L-1],然后枚举的复杂度是n^2,所以就可以了...

第三题看不太清楚,最好有个文本啥的...那我就先只答前面两题了...

如果还是没听懂,可以追问。

 

第一题代码:字符串hash的代码,其实说实话是可以逐位比较的。

所以这份代码感觉有点丑,你应该可以打出更好的:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
struct Node{
 char s[110];
}a[110];
int n,m,ans=0;
int rec[110];
char ch[110];
bool used[110];
const int mod=1423333;
bool cmp(const Node &A,const Node &B){
 return strcmp(A.s,B.s)<0;
}
int main(){
 int kase;
 
 scanf("%d",&kase);
 
 while(kase--){
  scanf("%d",&m);
  scanf("%s",ch);
  n=strlen(ch);
  memset(used,0,sizeof(used));
  
  for(int i=0;i<n-m;i++){
   ll cnt=0;//字符串hash,将原串转化成一个27进制的数字来判断
   for(int j=0;j<m;j++)
    cnt=(cnt*27+ch[i+j]-'a')%mod;
   rec[i]=cnt;
   for(int j=0;j<i;j++)//如果之前出现过,就把之前的屏蔽掉
    if(rec[j]==rec[i]) used[j]=true;
  }
  
  int t=0;
  for(int i=0;i<=n-m;i++)
   if(!used[i]){
    t++;
    memset(a[t].s,0,sizeof(a[t].s));
    for(int j=0;j<m;j++)//把需要输出的存起来
     a[t].s[j]=ch[i+j];
   }
  sort(a+1,a+t+1,cmp);//按字典序排序
  for(int i=1;i<=t;i++)
   puts(a[i].s);
  
  putchar('\n');
 }
 
 return 0;
}

第二题代码:这个就比较简单易懂了,也感觉优美一些。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans;
int a[1010],s[1010];
int main(){
 int kase;
 
 scanf("%d",&kase);
 
 while(kase--){
  scanf("%d",&n);
  for(int i=1;i<=n;i++) scanf("%d",&a[i]);
  for(int i=1;i<=n;i++) s[i]=s[i-1]^a[i];
  
  int ans=0;
  for(int L=1;L<=n;L++)
   for(int R=L;R<=n;R++)
    ans=max(ans,s[R]^s[L-1]);
  printf("%d\n",ans);
 }
 
 return 0;
}
温馨提示:内容为网友见解,仅供参考
无其他回答

关于acm的一点问题
如果真要认真搞ACM,最重要的就是刷题,到CodeForce,TopCoder上面刷题,或者也可以到HDOJ,POJ上面刷题,或者到VirtualJudge,BNUOJ上面跟队友开比赛。还有很多国外的OJ。反正就是不断地刷题,学习,打比赛。像你某位整天LOL的同学那样就行了。

C语言编程,简单的题目
晕,怎么又是你,ACM的题是要自己多多练习的。下面给你个参考答案,以后希望你自己做。include <stdio.h> int main(){ int a[20][20],b[20][20];int n,i,j,sum,k;scanf("%d",&n);for(i=0;i<n;i++){ for(j=0;j<n;j++){ scanf("%d",&a[i][j]);} } \/***\/ for(...

关于ACM竞技大赛
个人关点,你可以看点算法书之类的,好像对计算机专业的学生在大一的时候也没有学什么好专业的知识,和其它的学的都差不了太多,我是学软件工程的,我们现在也只学了C语言,数据结构,你看下数据结构,学习学习算法思想,然后再找个OJ做点题练习下就差不多了,当然如果要取得好成绩是要下很多功夫的,...

c语言贪心算法,求解释 http:\/\/acm.hrbeu.edu.cn\/index.php?ac_百度...
求的是12个月加起来盈利或者亏损的所有情况中的绝对值最小的那个,从例子和别人解释中得到的结论,但是怎么看这都不是题目问的,但是测试的例子就是那样求出来的。

ACM1211问题 这题不是只需要输入4个数字吗 为什么INPUT里面第二行那 ...
第二行是对应每个字符的密码 昨天答得就是你的问题哈,昨天问的是1210~正在挨个刷HDU?加油吧~但是自己看看想想,哪怕wa上几个小时之后AC了,要比直接问有收获的多~加油吧

C语言POJ的一个题目算法没看懂,求帮忙。。。
≡这个是恒等于的意思,n ≡ 0 (mod 4),所以这句话的意思是n除以4余0,mod是取模运算,n关于4取模,也就是求n除以4的余数,另一句同理。下面分类讨论了两种情况,得出了不动点,即经过映射后,是自身的点。

acm初学者要准备什么 看什么书啊
一、语言是最重要的基本功 无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关。亚洲赛区的比赛支持的语言包括C\/C++与JAVA。笔者首先说说JAVA,众所周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的优势,但是对于信息学比赛的具体场合,JAVA则显得不那么...

ACM 的一道题提交总是Time Limit Exceeded,求救
你是怎么做的? 二分图的多重匹配这题,如果暴力做的话会T的 代码附一个吧:include<iostream> include<cstdio> include<cstring> using namespace std;const int N=100010;int n,m;int cap[11],map[N][11];int val[11],mat[11][N];int mark[11];bool dfs(int x){ for(int i=0...

哪位帮我看一下hdu acm 1040这样编为什么不行啊?
using namespace std;int main(){ int T,N,n,i,j;long int a[1002]; \/\/题目有说明输入的数据类型均为int ,所以没必要定义为long cin>>T; \/\/已经有多组数据测试,添加while()反而无法AC while (T--){ cin>>N;n=N;i=0;while (n--)cin>>a[i++];for (j=1;j<N;j++)for...

C语言求几个数和
\/\/求数组所有数的和 int GetTotal(int* input, int size){ int total = 0;for(int i = 0; i < size; i++){ total += input[i];} return total;} \/\/判断是否可以将数组最大数拆分成倒数第二个数以及另外一个数 bool divideNum(int* input, int size, int total){ \/\/取一半值...

相似回答