计算机并不仅仅能够处理数学问题,还可以用来处理文字,比如写文章、处理代码、记录信息等等……如果需要将各种语句记录在计算机中,就要用到字符串或者字符数组。

我们已经在最开始的地方尝试输出过”I love Luogu” 的字符串,也介绍过单个字符和数字对应的 ASCII 编码。在这一章会介绍字符串的存储和处理的方法。同时也初步接触了 STL,这使得可以“站在前人的肩膀上”完成程序,简化编程的难度。

https://www.luogu.com.cn/training/104

P5733 【深基6.例1】自动修正

#include<bits/stdc++.h>   
using namespace std;  
int main(void)  
{  
	string s; cin>>s;  
	for(int i=0;i<s.size();i++) s[i]=toupper(s[i]);  
	cout<<s;  
	return 0;  
}  

P1914 小书童——凯撒密码

#include<bits/stdc++.h>  
using namespace std;  
int main(void)  
{  
	int n; cin>>n;  
	string s; cin>>s;  
	for(int i=0;i<s.size();i++) s[i]='a'+(s[i]-'a'+n)%26;  
	cout<<s;  
	return 0;  
}  

P1125 [NOIP2008 提高组] 笨小猴

#include<bits/stdc++.h>   
using namespace std;  
int st[35];  
int check(int x)  
{  
	if(x==0) return 0;  
	if(x==1) return 0;  
	for(int i=2;i<=x/i;i++)  
		if(x%i==0) return 0;  
	return 1;  
}  
int main(void)  
{  
	string a; cin>>a;  
	for(int i=0;i<a.size();i++) st[a[i]-'a']++;  
	int minv=1e9,maxv=-1;  
	for(int i=0;i<26;i++)  
		if(st[i]) minv=min(minv,st[i]),maxv=max(maxv,st[i]);  
	if(check(maxv-minv)) cout<<"Lucky Word"<<'\n'<<maxv-minv;  
	else cout<<"No Answer"<<'\n'<<0;  
	return 0;  
}  

P1957 口算练习题

#include<bits/stdc++.h>  
using namespace std;  
const int N=1e5+10;  
int n;  
struct node  
{  
	int a,b;  
	char op;  
}Node[N];  
int main(void)  
{  
	cin>>n;  
	string s,a; getline(cin,s);  
	for(int i=0;i<n;i++)  
	{  
		getline(cin,s);  
		stringstream l(s);  
		vector<string>ve;  
		while(l>>a) ve.push_back(a);  
		if(ve.size()==2)  
		{  
		    Node[i].op=Node[i-1].op;  
		    Node[i].a=stoi(ve[0]);  
		    Node[i].b=stoi(ve[1]);  
		}  
		else  
		{  
		    Node[i].op=ve[0][0];  
		    Node[i].a=stoi(ve[1]);  
		    Node[i].b=stoi(ve[2]);  
		}  
	}  
	for(int i=0;i<n;i++)  
	{  
	    string ans;  
		if(Node[i].op=='a')   
		    ans=ans+to_string(Node[i].a)+"+"+to_string(Node[i].b)+"="+to_string(Node[i].a+Node[i].b);  
		if(Node[i].op=='b')   
			ans=ans+to_string(Node[i].a)+"-"+to_string(Node[i].b)+"="+to_string(Node[i].a-Node[i].b);  
		if(Node[i].op=='c')   
			ans=ans+to_string(Node[i].a)+"*"+to_string(Node[i].b)+"="+to_string(Node[i].a*Node[i].b);  
		cout<<ans<<endl;  
		cout<<ans.size()<<endl;  
	}  
	return 0;  
}  

P5015 [NOIP2018 普及组] 标题统计

#include<bits/stdc++.h>   
using namespace std;  
int main(void)  
{  
	string s; getline(cin,s);  
	int flag=0;  
	for(int i=0;i<s.size();i++)  
	{  
		if(s[i]>='a'&&s[i]<='z')  flag++;  
		if(s[i]>='A'&&s[i]<='Z')  flag++;  
		if(s[i]>='0'&&s[i]<='9')  flag++;  
	}  
	cout<<flag;  
	return 0;  
}  

P5734 【深基6.例6】文字处理软件

#include<bits/stdc++.h>  
using namespace std;  
int main(void)  
{  
    int n; cin>>n;  
    string s; cin>>s;  
    while(n--)  
    {  
        int op; cin>>op;  
        if(op==1)  
        {  
            string a; cin>>a;  
            s+=a;  
            cout<<s<<endl;  
        }else if(op==2)  
        {  
            int l,r; cin>>l>>r;  
            string temp;  
            for(int i=l;i<=l+r-1;i++) temp+=s[i];  
            s=temp;  
            cout<<s<<endl;  
        }else if(op==3)  
        {  
            int index; cin>>index;  
            string a,temp; cin>>a;  
            for(int i=0;i<index;i++) temp+=s[i];  
            temp+=a;  
            for(int i=index;i<s.size();i++) temp+=s[i];  
            s=temp;  
            cout<<s<<endl;  
        }else   
        {  
            string a; cin>>a;  
            cout<<(int)s.find(a)<<endl;  
        }  
    }  
    return 0;  
}  

P1308 [NOIP2011 普及组] 统计单词数

#include<bits/stdc++.h>  
using namespace std;  
int main(void)  
{  
    string a,b,s;  
    getline(cin,a);  
    getline(cin,s);  
    stringstream l(s);  
    for(int i=0;i<a.size();i++) a[i]=tolower(a[i]);  
    for(int i=0;i<s.size();i++) s[i]=tolower(s[i]);  
    int cnt=0,index=0;  
    for(int i=0;i+a.size()-1<s.size();i++)  
    {  
        if((!i||s[i-1]==' ')&&s[i]!=' ')  
        {  
            int j=i;  
            string temp;  
            temp+=s[j];  
            while(j+1<s.size()&&s[j+1]!=' ') temp+=s[j+1],j++;  
            if(temp==a)  
            {  
                if(!cnt) index=i;  
                cnt++;  
            }  
            i=j;  
        }  
    }  
    if(cnt) cout<<cnt<<" "<<index<<endl;  
    else cout<<-1;  
}  

P1765 手机

#include<bits/stdc++.h>  
using namespace std;  
map<char,int>mp;  
int main(void)  
{  
    mp['a']=1,mp['b']=2,mp['c']=3;  
    mp['d']=1,mp['e']=2,mp['f']=3;  
    mp['g']=1,mp['h']=2,mp['i']=3;  
    mp['j']=1,mp['k']=2,mp['l']=3;  
    mp['m']=1,mp['n']=2,mp['o']=3;  
    mp['p']=1,mp['q']=2,mp['r']=3,mp['s']=4;  
    mp['t']=1,mp['u']=2,mp['v']=3;  
    mp['w']=1,mp['x']=2,mp['y']=3,mp['z']=4;  
    mp[' ']=1;  
    string s; getline(cin,s);  
    int sum=0;  
    for(int i=0;i<s.size();i++) sum+=mp[s[i]];  
    cout<<sum;  
    return 0;  
}  

P3741 honoka的键盘

#include<bits/stdc++.h>  
using namespace std;  
int n;  
string s;  
int main(void)  
{  
    cin>>n>>s;  
    int cnt=0;  
    for(int i=0;i<s.size();i++)  
        if(i&&s[i]=='K'&&s[i-1]=='V') cnt++;  
    for(int i=0;i<s.size();i++)  
    {  
        string a=s; a[i]='V';  
        int temp=0;  
        for(int j=0;j<a.size();j++)  
             if(j&&a[j]=='K'&&a[j-1]=='V') temp++;  
        cnt=max(cnt,temp);  
    }  
    for(int i=0;i<s.size();i++)  
    {  
        string a=s; a[i]='K';  
        int temp=0;  
        for(int j=0;j<a.size();j++)  
             if(j&&a[j]=='K'&&a[j-1]=='V') temp++;  
        cnt=max(cnt,temp);  
    }  
    cout<<cnt;  
    return 0;  
}  

P1321 单词覆盖还原

#include<bits/stdc++.h>   
using namespace std;  
int main(void)  
{  
	string s; cin>>s;  
	int ans1=0,ans2=0;  
	for(int i=0;i<s.size();i++)  
	{  
		if(s[i]=='b') ans1++;  
		if(s[i]=='o'&&s[i-1]!='b') ans1++;  
		if(s[i]=='y'&&s[i-1]!='o') ans1++;  
		  
		if(s[i]=='g') ans2++;  
		if(s[i]=='i'&&s[i-1]!='g') ans2++;  
		if(s[i]=='r'&&s[i-1]!='i') ans2++;  
		if(s[i]=='l'&&s[i-1]!='r') ans2++;  
	}  
	cout<<ans1<<'\n'<<ans2;  
	return 0;  
}  

P1553 数字反转(升级版)

#include<bits/stdc++.h>   
using namespace std;  
int main(void)  
{  
	string s; cin>>s;  
	if(s.find('.')!=-1)  
	{  
		int index=s.find('.');  
		string a=s.substr(0,index);   
		string b=s.substr(index+1);  
		reverse(a.begin(),a.end());  
		reverse(b.begin(),b.end());  
		while(a.size()>1&&a[0]=='0') a=a.substr(1);  
		while(b.size()>1&&b[b.size()-1]=='0') b=b.substr(0,b.size()-1);  
		cout<<a<<"."<<b;  
	}else if(s.find('/')!=-1)  
	{  
		int index=s.find('/');  
		string a=s.substr(0,index);   
		string b=s.substr(index+1);  
		reverse(a.begin(),a.end());  
		reverse(b.begin(),b.end());  
		while(a.size()>1&&a[0]=='0') a=a.substr(1);  
		while(b.size()>1&&b[0]=='0') b=b.substr(1);  
		cout<<a<<"/"<<b;  
	}  
	else if(s.find('%')!=-1)  
	{  
		s=s.substr(0,s.size()-1);  
		reverse(s.begin(),s.end());  
		while(s.size()>1&&s[0]=='0') s=s.substr(1);  
		cout<<s<<'%';  
	}else   
	{  
		reverse(s.begin(),s.end());  
		while(s.size()>1&&s[0]=='0') s=s.substr(1);  
		cout<<s;  
	}  
	return 0;  
}  

P1603 斯诺登的密码

//错误代码  
#include<bits/stdc++.h>  
using namespace std;  
map<string,int>q;  
int main(void)  
{  
	q["one"]=1;q["two"]=2;q["three"]=3;q["four"]=4;q["five"]=5;q["six"]=6;q["seven"]=7;q["eight"]=8;q["nine"]=9;q["ten"]=10;   
    q["eleven"]=11;q["twelve"]=12;q["thirteen"]=13;q["fourteen"]=14;q["fifteen"]=15;q["sixteen"]=16;q["seventeen"]=17;q["eighteen"]=18;q["nineteen"]=19;q["twenty"]=20;  
    q["a"]=1;q["both"]=2;q["another"]=1;q["first"]=1;q["second"]=2;q["third"]=3;  
    string a;  
    vector<int>ve;  
    while(cin>>a,a!=".")  
    {  
    	if(q[a])   
    	{  
    		ve.push_back(q[a]*q[a]%100);  
    	}  
	}  
    sort(ve.begin(),ve.end());  
    if(ve.size())  
    {	  
    	for(int i=0;i<ve.size();i++)  
		{  
			if(i==0) cout<<ve[i];  
			else printf("%02d",ve[i]);  
		}  
	}  
	if(!ve.size()) cout<<0;  
	return 0;   
}  
#include<bits/stdc++.h>  
using namespace std;  
map<string,int>q;  
int main(void)  
{  
	q["one"]=1;q["two"]=2;q["three"]=3;q["four"]=4;q["five"]=5;q["six"]=6;q["seven"]=7;q["eight"]=8;q["nine"]=9;q["ten"]=10;   
    q["eleven"]=11;q["twelve"]=12;q["thirteen"]=13;q["fourteen"]=14;q["fifteen"]=15;q["sixteen"]=16;q["seventeen"]=17;q["eighteen"]=18;q["nineteen"]=19;q["twenty"]=20;  
    q["a"]=1;q["both"]=2;q["another"]=1;q["first"]=1;q["second"]=2;q["third"]=3;  
    string a;  
    vector<int>ve;  
    while(cin>>a,a!=".")  
    {  
    	if(q[a])   
    	{  
    		ve.push_back(q[a]*q[a]%100);  
    	}  
	}  
    sort(ve.begin(),ve.end());  
    if(ve.size())  
    {	  
    	string ans;  
    	for(int i=0;i<ve.size();i++)  
		{  
			string temp=to_string(ve[i]);  
			if(temp.size()<2) temp="0"+temp;  
			ans+=temp;  
		}  
		while(ans.size()>1&&ans[0]=='0') ans=ans.substr(1);  
		cout<<ans;  
	}  
	if(!ve.size()) cout<<0;  
	return 0;   
}  

P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here

#include<bits/stdc++.h>   
using namespace std;  
int main(void)  
{  
	  
	string a,b; cin>>a>>b;  
	int sum1=1,sum2=1;  
	for(int i=0;i<a.size();i++) sum1*=a[i]-'A'+1;  
	for(int i=0;i<b.size();i++) sum2*=b[i]-'A'+1;  
	sum1%=47,sum2%=47;  
	if(sum1==sum2) cout<<"GO";  
	else cout<<"STAY";  
	return 0;  
}  

P1597 语句解析

#include<bits/stdc++.h>  
using namespace std;  
int ans[3]={0};  
int main(void)  
{  
	char a1,a2;  
	while(scanf("%c:=%c;",&a1,&a2)==2)  
	{  
		if(a2>='0'&&a2<='9') ans[a1-'a']=a2-'0';  
		else ans[a1-'a']=ans[a2-'a'];  
	}  
	for(int i=0;i<3;i++) cout<<ans[i]<<" ";  
	return 0;  
}  

P1598 垂直柱状图

#include<bits/stdc++.h>   
using namespace std;  
int st[35],temp;  
string s[4];  
int main(void)  
{  
	for(int i=0;i<4;i++) getline(cin,s[i]);  
	for(int i=0;i<4;i++)  
		for(int j=0;j<s[i].size();j++)  
			if(s[i][j]>='A'&&s[i][j]<='z') st[s[i][j]-'A']++;  
	for(int i=0;i<26;i++) temp=max(temp,st[i]);  
	for(int i=1;i<=temp;i++)  
	{  
		for(int j=0;j<26;j++)  
		{  
			if((temp-st[j])>=i) cout<<"  ";  
			else cout<<"* ";  
		}  
		puts("");  
	}  
	for(int i=0;i<26;i++) cout<<char('A'+i)<<" ";  
	return 0;  
}