天大计算机算法程序题(二)

本文解析了天大计算机算法竞赛的多个题目,包括统计特定字符串出现次数、寻找最长回文子串、求正整数的根、反转单词及判断子串等问题,并提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2016年

统计

在这里插入图片描述

#include<iostream>
#include<string>
using namespace std;

int main(){
  int m,n;
  cin>>m;
  string s;
  for(int i=1;i<=m;++i){
    cin>>n;
    int cnt=0;
    while(n--){
      cin>>s;
      if (s=="sheep")cnt++;
    }
    cout<<"case"<<i<<":this list contains "<<cnt<<" sheep\n";
  }
  return 0;
}

测试数据

3
5
sheep sheeps shep shepr shepp
7
sheep SHEEP Sheep sheep shepr sheer sherp
3
sheep sheep sheep.....

在这里插入图片描述

最长回文子串长度

给出一个只由小写英文字符 a,b,c…y,z 组成的字符串 S,求 S 中最长回文串的长度,回文就是正反读都是一样的字符串,如 aba, abba 等

#include<iostream>
#include<string>
#include<vector>
using namespace std;

string longestPalindrome(string s){
  string tmp = "$#";
  for (int i=0;i<s.size();i++){ //首先构造出新的字符串
    tmp += s[i];
    tmp += '#';
  }
    //cout<<tmp<<endl;
  vector<int> rd(tmp.size(), 0);//用一个辅助数组来记录最大的回文串长度,注意这里记录的是新串的长度,原串的长度要减去1
  int pos = 0, mx = 0;
  int start = 0, maxLen = 0;
  for (int i = 1; i < tmp.size(); i++) {
    rd[i] = i < mx ? min(rd[2 * pos - i], mx - i) : 1;
    while (i+rd[i]<tmp.size() && i-rd[i]>0 && tmp[i + rd[i]] == tmp[i - rd[i]])//这里要注意数组越界的判断,源代码没有注意,release下没有报错
        rd[i]++;
    if (i + rd[i] > mx) {//如果新计算的最右侧端点大于mx,则更新pos和mx
      pos = i;
      mx = i + rd[i];
    }
    if (rd[i] - 1 > maxLen) {
      start = (i - rd[i]) / 2;
      maxLen = rd[i] - 1;
    }
  }
  return s.substr(start, maxLen);
}

int main(){
  int n;
  cin>>n;
  string s;
  while(n--){
    cin>>s;
    cout<<longestPalindrome(s).size()<<endl;
  }
  return 0;
}

测试数据

2
aaaa
abac

在这里插入图片描述

2015年

求正整数的根

在这里插入图片描述

#include<iostream>
using namespace std;

int getBitSum(int n){
  int sum = 0;
  while(n){
    sum += n%10;
    n/=10;
  }
  return sum;
}

int main(){
  int n;
  while(cin>>n&&n!=0){
    while(n/10 != 0){
      n = getBitSum(n);
    }
    cout<<n<<endl;
  }
  return 0;
}

测试数据

24
39
2
0

在这里插入图片描述

单词反转

在这里插入图片描述

#include<iostream>
#include<string>
#include<vector>
using namespace std;

vector<string> split(string src, char seq){
  vector<string> result;
  int len = src.size(),i;
  string tmp;
  for(i=0;i<len;++i){
    if(src[i]==seq){
      if(tmp=="")continue;
      result.push_back(tmp);
      tmp = "";
    }else {
      tmp += src[i];
    }
  }
  if (tmp != "" ) result.push_back(tmp);
  return result;
} // 把 字符串src 根据字符seq进行分割

string reverse(string s){
  string tmp;
  for(int i=s.length()-1;i>=0;--i)tmp += s[i];
  return tmp;
}

int main(){
  int n,len;
  cin>>n;
  cin.ignore();// 读取第一行后面的换行符 不然getline会读取到
  string s;
  while(n--){
    getline(cin,s);
    vector<string> result = split(s,' ');
    len = result.size()-1;
    for(int i=0;i<len;++i){
      cout<<reverse(result[i])<<" ";
    }
    if (len>=0) cout<<reverse(result[len])<<endl;
  }
  return 0;
}

测试数据

3
I am happy today
To be or not to be
I want to win the practice contest

在这里插入图片描述

2014年

解方程

在这里插入图片描述

#include<iostream>
using namespace std;

int main(){
  int n,a,b;
  cin>>n;
  while(n--){
    cin>>a>>b;
    cout<<(a+b)/2<<" "<<(a-b)/2<<endl;
  }
  return 0;
}

测试数据

2
5 1
48 22

在这里插入图片描述

判断子串

在这里插入图片描述

#include<iostream>
using namespace std;

int main(){
  int n;
  cin>>n;
  string sub,str;
  while(n--){
    cin>>sub>>str;
    int i=0,j=0,sublen = sub.length(),strlen =  str.length();
    while(i<sublen&&j<strlen){
      if(sub[i]==str[j]) {
        i++;
        j++;
      }else {
        j++;
      }
    }
    if (i==sublen) cout<<"Yes\n";
    else cout<<"No\n";
  }
  return 0;
}

测试数据

2
sequence subsequence
person compression

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值