牛客每日训练----回文串,化整为零,珂朵莉的无向图

大提琴的声音就像一条河,左岸是我无法忘却的回忆,右岸是我值得紧握的璀璨年华,中间流淌的,是我年年岁岁淡淡的感伤

链接:https://ac.nowcoder.com/acm/problem/14517
来源:牛客网
 

题目描述

 

 既然大家都知道回文串是怎么回事了,那我们就长话短说,现在有一个字符串,长度小于1200,我想知道最长的回文子串长度是多少。 

输入描述:

多组输入,输入字符串只包含小写字母。

输出描述:

每组输出一个数字,表示最长的回文子串。

示例1

输入

复制

aqppqole
ebcml

输出

复制

4
1
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath> 
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
char s[10010];
int  manacher(string s){
    string tmp="$#";
    for(int i=0; i<s.length(); i++){
        tmp+=s[i];
        tmp+='#';
    }
    vector<int> p(tmp.length()+1,0);
    int mx=0,id=0,ls=0,cd=0;
    for(int i=1; i<tmp.length(); i++){
        if (mx>i)
            p[i]=min(p[id*2-i],mx-i);
        else
            p[i]=1;
        while(tmp[i+p[i]]==tmp[i-p[i]]) 
			p[i]++;
        if (mx<p[i]+i){
            mx=p[i]+i;
            id=i;
        }
        if (cd<p[i]){
            cd=p[i];
            ls=i;
        }
    }
    return cd-1;
}
int main(){
    while(scanf("%s",s)!=EOF){
        cout<<manacher(s)<<endl;
    }
    return 0;
}

链接:https://ac.nowcoder.com/acm/problem/14515
来源:牛客网

 

 

题目描述

1968年某天,罗伯·舒乐博士立志要在加州用玻璃建造一座水晶大教堂。他向着名的建筑设计师菲利普表达了自己的构思:“我要的不是一座普通的教堂,而是一座人间的伊甸园。”

菲利普问舒乐预算多少,舒乐博士坚定地对他说:“事实上,现在我一毛钱都没有,所以对我来说,100万美元和400万美元并没有区别。重要的是,这座教堂本身要具有足够的吸引力,吸引捐助者的到来。”

教堂最终敲定需要的预算是700万美元。这个数字不但超出了舒乐博士的承受能力,甚至也超出了他的想象范围,其他人也都对舒乐博士说“这似乎不可能”。

但舒乐博士却想出了一个化整为零的方法。他在一张纸上写着“700万美元”,然后在这个目标下面写道:

1.找1笔700万美元的捐款;

2.找7笔100万美元的捐款;

3.找14笔50万美元的捐款;

……

那么问题来了,现在东东有一个非常大的数字n,大概有10^100那么大,他想把这个数字按照一定规则化小,规则是这样:

1,把n的每一位数字加起来得到一个数字n1

2,把n1的每一位数字加起来得到一个数字n2

3,把n2的每一位数字加起来得到一个数字n3

.......

直到得到数字ni 小于10停止,把ni输出

输入描述:

多组输入。
每行输入一个正整数n。

输出描述:

输出一个数字,表示结果。

示例1

输入

复制

99999999999
123

输出

复制

9
6
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath> 
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
string s;
int main()
{
    while(cin>>s)
    {
        int sum=0;
        for(int i=0;i<s.size();i++)
            sum+=s[i]-'0';
        while(sum>=10)
        {
            int sum1=0;
            while(sum>0)
            {
                sum1+=sum%10;
                sum/=10;
            }
            sum=sum1;
        }
        cout<<sum<<endl;
    }
    return 0;
}

链接:https://ac.nowcoder.com/acm/problem/14521
来源:牛客网

 

 

题目描述

珂朵莉给了你一个无向图,每次查询给t个点以及一个常数s,求有多少个图中的点距离给出的那t个点中至少一个距离 <= s

输入描述:

第一行三个数表示n,m,q
之后m行每行两个数u,v表示有一条边位于u和v两个点之间
之后 2 x q 行表示询问
每次询问先输入两个数t,s
之后一行t个数,表示t个特殊点

输出描述:

q行,每行一个数表示答案

示例1

输入

复制

5 6 6
2 3
1 3
2 5
1 3
3 2
2 5
1 1
3
1 1
1
1 4
1
1 2
5
1 4
1
1 4
5

输出

复制

3
2
4
3
4
4

说明

n,m,q<= 5000 ,t的和<= 500000, s <= 109
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath> 
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
vector<int>v[5010];
queue<int>q;
int mp[5010],n,m,qq,x,y,t,s;
int bfs(){
    int ant=0;
     while(!q.empty()){
        int tmp=q.front();
        q.pop();
        for(int i=1;i<v[tmp].size();i++){
            if(mp[v[tmp][i]])
			continue;
            int temp=v[tmp][0]+1;
            if(temp>s)
			continue;
            ant++;
            int ls=v[tmp][i];
            v[ls][0]=temp;
            mp[v[tmp][i]]=1;
            q.push(v[tmp][i]);
        }
     }
      return ant;
}
int main(){
    scanf("%d%d%d",&n,&m,&qq);
    for(int i=1;i<=n;i++)
		v[i].push_back(0);
    for(int i=0;i<m;i++){
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }
    while(qq--){
        int sum=0;
        memset(mp,0,sizeof(mp));
        scanf("%d%d",&t,&s);
        for(int i=0;i<t;i++){
            scanf("%d",&x);
           	if(mp[x])
		   	continue;
            q.push(x);
            v[x][0]=0;
            mp[x]=1;
            sum++;
        }
        sum+=bfs();
        printf("%d\n",sum);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值