大提琴的声音就像一条河,左岸是我无法忘却的回忆,右岸是我值得紧握的璀璨年华,中间流淌的,是我年年岁岁淡淡的感伤
链接: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;
}