ACM基础知识——vector、字符串、数组...

Stammering chemists(vector)

题目来源:牛客
基本知识:

  • 定义vector
  • push_back(),pop_back()
  • back()–返回当前vector容器中末尾元素的引用。
    front()–返回当前vector容器中起始元素的引用。
    end()–指向最后一个元素的下一位置,所以访问最后一个元素的正确操作为v1.end() - 1
  • goto loop
#include<bits/stdc++.h>
#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<bits/stdc++.h>
#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<<x<<endl;
	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;
}

密码解题(字母对应从0开始的下标,水)

题目来源:洛谷

#include<bits/stdc++.h>
#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;
}

CCPC、正正负正型输出

题目来源:CCPC2019网络赛
输出方法很强

#include <bits/stdc++.h>
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;
}
*/ 

拖拽卡片(vector)

题目来源 :CCPC2019网络赛1006

#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#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;
}

FangsFang

题目来源:计蒜客
思路:把所有的字串统一成第一位是c,再判断。有个坑,出现其他字母直接输出-1!!!全为f的字串结果为(长度+1)/2;含c,cf输出-1;没有不满足情况时,数c的个数。

#include <set>
#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define ll long long
#define pii pair<int, int>
#define pll pair<ll, ll>
#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;
}
发布了54 篇原创文章 · 获赞 26 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43629813/article/details/99718197