题目来源:牛客:
基本知识:
#include
#define ll long long
using namespace std;
#define ind(x) scanf("%d",&x)
#define outs(s) printf("%s\n",s)
vector<int> a[7];
int num[7];
int main(){
int t;
ind(t);
while(t--){
for(int i=1;i<=6;i++){
a[i].clear();
num[i]=0;
}
for(int i=0;i<5;i++){
int x,y;
ind(x);ind(y);
a[x].push_back(y);
a[y].push_back(x);
num[x]++;
num[y]++;
}
int n3=0,pos=0;
for(int i=1;i<=6;i++){
if(num[i]==4){
outs("2,2-dimethylbutane");
goto loop;
}
if(num[i]==3){
n3++;
pos=i;
}
}
if(!n3)outs("n-hexane");
else if(n3==2)outs("2,3-dimethylbutane");
else{
int k=0;
while(!a[pos].empty()){
if(num[a[pos].back()]==2)
k++;
a[pos].pop_back();
}
if(k==2) outs("3-methylpentane");
else
outs("2-methylpentane");
}
loop:;
}
return 0;
}
题目来源:洛谷
巧妙之处在于对要找的字串两端加空格(原字串也要加),省去了分割长字串的麻烦。
#include
#define ll long long
using namespace std;
int main(){
string str1,str2;
getline(cin,str1);
getline(cin,str2);
int len1=str1.size();
int len2=str2.size();
for(int i=0;i<len1;i++){
str1[i]=tolower(str1[i]);
}
for(int i=0;i<len2;i++){
str2[i]=tolower(str2[i]);
}
int num=0;
str1=' '+str1+' ';//连起来的不算,在str1前后加空格!!
str2=' '+str2+' ';
int x=str2.find(str1);
//cout<
if(x==-1){
cout<<x<<endl;
}
else{
while(str2.find(str1)!=-1) {
num++; str2=str2.substr(str2.find(str1)+len1);//每次将匹配的位置前的字符删除,重新开始找
}
cout<<num<<" "<<x<<endl;
}
return 0;
}
题目来源:洛谷
#include
#define ll long long
using namespace std;
int main(){
char in[50];
int n;
scanf("%d%s",&n,in);
for(int j=0;in[j]!='\0';j++){
putchar((in[j]-'a'+n)%26+'a');
}
return 0;
}
题目来源:CCPC2019网络赛
输出方法很强
#include
using namespace std;
const int N = 1030;
int a[N][N][11];
void init()
{
a[1][1][1]=1;
a[1][2][1]=1;
a[2][1][1]=-1;
a[2][2][1]=1;
for(int i=2;i<=10;i++)
{
for(int ii=1;ii<=(1<<(i-1));ii++)
for(int ij=1;ij<=(1<<(i-1));ij++)
{
a[ii][ij][i]=a[ii][ij][i-1];
}//左上,等于上一组,i-1
for(int ii=((1<<(i-1))+1);ii<=(1<<i);ii++)
for(int ij=1;ij<=(1<<(i-1));ij++)
{
a[ii][ij][i]=-a[ii-(1<<(i-1))][ij][i];
}//左下,下半部分每行对应上半部分每行
for(int ii=1;ii<=(1<<(i-1));ii++)
for(int ij=((1<<(i-1))+1);ij<=(1<<i);ij++)
{
a[ii][ij][i]=a[ii][ij-(1<<(i-1))][i];
}//右上,后半部分的列对应前半部分的列
for(int ii=((1<<(i-1))+1);ii<=(1<<i);ii++)
for(int ij=((1<<(i-1))+1);ij<=(1<<i);ij++)
{
a[ii][ij][i]=a[ii-(1<<(i-1))][ij][i];
}//右下,下半部分行对应上半部分行
}
}
vector<int> ch[N];
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
int i;
scanf("%d",&i);
for(int ii=1;ii<=(1<<i);ii++)
{
for(int ij=1;ij<=(1<<i);ij++)
{
cout<<(a[ii][ij][i]==1?'C':'P');
}
cout<<endl;
}
}
return 0;
}
*/
题目来源 :CCPC2019网络赛1006
#include
using namespace std;
#define ll long long
#define pii pair
#define pll pair
#define mid (r+l)*0.5
#define l (d<<1)
#define r ((d<<1)&1)
const int N=100007;
const int M=100007;
const int inf=0x3f3f3f;
const double eps=1e-6;
#define ind(x) scanf("%d",&x)
#define inlf(x) scanf("%lf",&x)
#define inlld(x) scanf("%lld",&x)
#define ins(s) scanf("%s",s)
#define outd(x) printf("%d ",x)
#define outlf(x) printf("%lf\n",x)
#define outlld(x) printf("%lld\n",x)
#define outs(s) printf("%s",s)
vector<int> ve;
int a[N];
bool ch[N];
int main()
{
int n,m;
ind(n);ind(m);
for(int i=1;i<=n;i++)
{
ind(a[i]);
}
for(int i=n;i>=1;i--)
{
ve.push_back(a[i]);
}
for(int i=1;i<=m;i++)
{
int b;
ind(b);
ve.push_back(b);
}
while(!ve.empty())
{
if(!ch[ve.back()])
{
outd(ve.back());
ch[ve.back()]=1;
}// 只输出一次,跟把数字提前是一个效果
ve.pop_back();
}
return 0;
}
题目来源:计蒜客
思路:把所有的字串统一成第一位是c,再判断。有个坑,出现其他字母直接输出-1!!!全为f的字串结果为(长度+1)/2;含c,cf输出-1;没有不满足情况时,数c的个数。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
#define pii pair
#define pll pair
#define mid (r+l)*0.5
#define l (d<<1)
#define r ((d<<1)&1)
const int N=2000007;
const int M=100007;
const int inf=0x3f3f3f;
const double eps=1e-6;
#define ind(x) scanf("%d",&x)
#define inlf(x) scanf("%lf",&x)
#define inlld(x) scanf("%lld",&x)
#define ins(s) scanf("%s",s)
#define inpii(x) scanf("%d %d",&x.first,&x.second)
#define outd(x) printf("%d",x)
#define outlf(x) printf("%lf\n",x)
#define outlld(x) printf("%lld",x)
#define outs(s) printf("%s",s)
#define outpii(x) printf("%d %d\n",x.first,x.second)
int main()
{
int t,cas=0;
ind(t);
while(t--)
{
printf("Case #%d: ",++cas);
char str[N];
memset(str,0,sizeof(str));
scanf("%s",str);
int len=(int)strlen(str),cnt=-1;
int ans=0;
for(int i=0;i<len;i++){
if(str[i]!='c'&&str[i]!='f'){
printf("-1");
goto loop;
}
}
for(int i=0;i<len;i++)
{
if(str[i]=='c')
{
cnt=i;
break;
}
str[len+i]='f';
}
if(cnt==-1)
{
printf("%d",(len+1)/2);
goto loop;
}
for(int i=cnt;i<len+cnt;i++)
{
if(str[i]=='c')
{
ans++;
if(str[i+1]!='f'||str[i+2]!='f')
{
printf("-1");
goto loop;
}
}
}
printf("%d",ans);
loop: ;
printf("\n");
}
return 0;
}