题目:UVALive - 6439    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4450

题意:  输入一个整数 t ,  代表程序测试的次数 , 然后要将一些非回文串进行替换形成回文串,  求形成的回文串的最大长度。

例如      abdab       ->  非回文串     但是将ab替换成另一个字符*    那么形成   *d*  最长是3,所以最终结果输出3。

做这题之前,先来了解C++中的  string   的用法    。

1.

string  是包含在  头文件<string> 中   记住并非是   cstring 或者是 string.h    ,而是另起一个头文件   string

并且需要加上  using namespace std;  的命名空间

2.

string 是c++语言中已经定义的类 ,属于一种类,

所以存在着构造函数和析构函数,

假设

string  str;   //先声明

string(int n,int c)  ;    ------>>>>  作用是  对str进行构造函数赋值    复制是n个c是字符串

例如    str.string (3 ,'#');    那么输出   str 是    ###     //三个

还存在  string (const char *p)       ----->   拷贝构造赋值

例如:   str.string("*****");    那么输出   str  s    *****

3.

此处是解题关键,

string l="",r="";  //空内容

l=l+'a';        //   l的内容是a

l=l+'b'        //    l的内容是ab

l=l+'d'        //    l的内容是abd

  以此类推

string  s="abc";

s='g'+s;      //    s的内容是gabc

s='y'+s;      //    s的内容是ygabc

  以此类推           (主要说明   这里加法是 字符串的连接,接前接后看加法的前后)

ac代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Swap(a,b,t) t=a,a=b,b=t
#define Mem0(x) memset(x,0,sizeof(x))
#define Mem1(x) memset(x,-1,sizeof(x))
#define MemX(x) memset(x,0x3f,sizeof(x))
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f;
const double eps=1e-;
char str[];
int main()
{
int t,cnt=;
cin>>t;
while (t--){
cin>>str;
int ans=;
string l="",r="";
int len=strlen(str);
int mid=len/;
for (int i=len-;i>=mid;i--){
l=l+str[len--i];
r=str[i]+r;
if (l==r&&len--i!=i){
ans+=;
l.clear();
r.clear();
}
if (i==len/&&!l.empty())
ans++;
}
printf("Case #%d: %d\n",++cnt,ans);
}
return ;
}

*******************************************我是分割线***********************************************

链接:https://ac.nowcoder.com/acm/contest/392/J
来源:牛客网

题目描述

月月和华华一起去吃饭了。期间华华有事出去了一会儿,没有带手机。月月出于人类最单纯的好奇心,打开了华华的手机。哇,她看到了一片的QQ推荐好友,似乎华华还没有浏览过。月月顿时醋意大发,出于对好朋友的关心,为了避免华华浪费太多时间和其他网友聊天,她要删掉一些推荐好友。但是为了不让华华发现,产生猜疑,破坏了他们的友情,月月决定只删华华有可能搭讪的推荐好友。
月月熟知华华搭讪的规则。华华想与某个小姐姐搭讪,当且仅当小姐姐的昵称是他的昵称的子序列。为了方便,华华和小姐姐的昵称只由小写字母构成。为了更加方便,保证小姐姐的昵称长度不会比华华的长。
现在月月要快速的判断出哪些推荐好友要删掉,因为华华快回来了,时间紧迫,月月有点手忙脚乱,所以你赶紧写个程序帮帮她吧!

输入描述:

第一行输入一个字符串A表示华华的昵称。
第二行输入一个正整数N表示华华的推荐好友的个数。
接下来N行,每行输入一个字符串BiBi表示某个推荐好友的昵称。

输出描述:

输出N行,对于第i个推荐好友,如果华华可能向她搭讪,输出Yes,否则输出No。
注意大写,同时也要注意输出效率对算法效率的影响。
示例1

输入

复制

noiauwfaurainairtqltqlmomomo
8
rain
air
tql
ntt
xiaobai
oiiiooo
orzcnzcnznb
ooooo

输出

复制

Yes
Yes
Yes
Yes
No
Yes
No
No

备注:

1≤|A|≤1061≤|A|≤106,1≤N≤1061≤N≤106,1≤∑Ni=1Bi≤106

解法1(百度子序列自动机)

解法2(利用string里的find的函数)

string a;

a.find('a');    //在string类的a中查找第一个  字符a,返回值为该a的地址

a.find('b',pos);    //   在string类的a中从位置pos开始查找第一个字符b,同样返回值为该b地址       假若b位置之后不存在元素b,那么返回的是npso值,实际值为-1
解法一(STL中string的直接使用):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Swap(a,b,t) t=a,a=b,b=t
#define Mem0(x) memset(x,0,sizeof(x))
#define Mem1(x) memset(x,-1,sizeof(x))
#define MemX(x) memset(x,0x3f,sizeof(x))
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f;
const double eps=1e-;
string str1,str2;
int main()
{
int t;
cin>>str1>>t;
int len1=str1.length();
while (t--){
cin>>str2;
int len2=str2.length();
bool flag=true;
int pos=-,i=;
while (flag&&pos<len1&&i<len2){
pos=str1.find(str2[i],pos+);
if (pos==str1.npos) //若不存在则返回npso值,实为-1
flag=false;
i++;
}
if (flag)
printf("Yes\n");
else
printf("No\n");
}
return ;
}

解法二(子序列自动机):


子序列自动机详解:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define Mem0(x) memset(x,0,sizeof(x))
#define Mem1(x) memset(x,-1,sizeof(x))
#define MemX(x) memset(x,0x3f,sizeof(x))
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f; const int MAX=1e6+;
char str1[MAX],str2[MAX];
int dfs[MAX][],res[];
int main()
{
int n;
cin>>str1+>>n;
int len=strlen(str1+);
for (int i=;i<;i++)
res[i]=-;
for (int i=len;i>=;i--){
for (int j=;j<;j++){
dfs[i][j]=res[j];
}
res[str1[i]-'a']=i;
}
while (n--){
cin>>str2+;
int len1=strlen(str2+);
bool flag=true;
int tmp=;
for (int i=;i<=len1;i++){
if (dfs[tmp][str2[i]-'a']==-){
flag=false;
break;
}
tmp=dfs[tmp][str2[i]-'a'];
}
if (flag)
printf("Yes\n");
else
printf("No\n");
}
return ;
}
对于string类的输入问题

1.假若输入的字符串中不存在空格,    那么可以直接  用cin,   

    string a;
cin>>a;
int len=a.length();
cout<<"len="<<len<<endl;

不难发现这里和char型的输入是相同的。

2.那假若你输入的字符串中存在空格呢?   哪要怎么输入才能对?

  我们都知道gets函数,但是在语法上string不能用gets,否则会报错。

解决法案:  (使用getline函数)

    string a;
getline(cin,a);
int len=a.length();
cout<<"len="<<len<<endl;

其实getline是存在三个参数的函数。

getline(参数1,参数2,参数3)
参数1  ----> 输入  std::cin
参数2  ----> string变量名
参数3  ----> 结束字符 例子如下:(参数3可缺省)
    string a;
getline(cin,a,'a');
int len=a.length();
cout<<"len="<<len<<endl;

 

 截取字符串操作

 假设你现在要执行的操作是截取string部分字符串,通过暴力截取的方法不如使用下列库函数。

1.str1.substr(a,b);   其中a,b都为整数,  这里的意思是截取地址a后的b个元素。(实例如下:)
int main()
{
string str,str1;
cin>>str1;
cout<<str1<<endl;
str=str1.substr(,);
cout<<str<<endl;
return ;
}



2.str1.replace();  替代函数

https://blog.csdn.net/jiary5201314/article/details/52502516/

c++中string (MFC)的更多相关文章

  1. 标准C++中string类的用法

    转自博客园:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非 ...

  2. C++中string跨DLL失败解决途径

    1.问题描述: 在一个MFC应用程序exe中,调用另一个DLL中的函数,函数中的一个形参是string类型的,每次调用都会出现乱码的情况. 调用前: 调用后: 2.原因分析: 不同的模块各自有一份C运 ...

  3. 标准C++中string类的用法总结

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  4. C++中string类的操作函数。

    相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯 ...

  5. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

  6. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  7. java中string内存的相关知识点

    (一):区别java内存中堆和栈: 1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中: 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该 ...

  8. java中String的相等比较

    首先贴出测试用例: package test; import org.junit.Test; /** * Created by Administrator on 2015/9/16. * */ pub ...

  9. java中String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

随机推荐

  1. ABAP类的文档生成工具

    本文介绍的工具原理和JavaDoc类似,位于software component BBPCRM 1. 在ABAP类里新建一个名为CLASS_DOCU的私有方法. 然后把所有的注释写在这个方法源代码的前 ...

  2. bzoj3106 [cqoi2013]棋盘游戏

    Description 一个n*n(n>=2)棋盘上有黑白棋子各一枚.游戏者A和B轮流移动棋子,A先走. l         A的移动规则:只能移动白棋子.可以往上下左右四个方向之一移动一格. ...

  3. Python Django 分页

    Python Django 分页 http://www.360doc.com/content/14/0721/17/16044571_396090985.shtml

  4. Django 模型中字段类型的ImageField

    model_pic = models.ImageField(upload_to = 'pic_folder/', default = 'pic_folder/None/no-img.jpg') 参数u ...

  5. 【[HNOI2015]菜肴制作】

    \(SDSC\)讲过的题,复习一下 如果用一个小根堆来维护拓扑的话显然是会不行的,因为这样求出来的是字典序最小的拓扑序,并不一定是1尽可能在前 因为字典序是贪心的,如果前面的一位能小就尽可能的小,并不 ...

  6. 【[POI2015]WIL-Wilcze doły】

    第一篇题解确实会被讨论区里的数据hack掉,那么就随便水一个不会被hack掉的题解吧 首先我们尝试着发现这道题的一些结论,你就会发现答案是单调的不降的 这里的答案不降指的是选择每一个位置\(i\)作为 ...

  7. PHP中__get()和__set()的用法实例详

    刚刚看到一个对我有用的文章,我就把它摘抄下来了.                                                                        php面 ...

  8. 安装mysql的时候提示1045错误的解决方法

    在安装mysql的时候提示1045错误,如图所示: 这种情况一般是之前卸载msyql的时候没有清理完一些文件之类的,导致给你提示存在安全问题,因此,只需要找到mysql一些系统的配置文件,并且将他们删 ...

  9. java GC是何时对什么东西做什么事情

    之前学习了javaGC的原理机制,有了一定的了解,现在做一个整理总结,便于理解记忆,包括三个问题: 1. java GC是什么时候做的? 2. java GC作用的东西是什么? 3. java GC具 ...

  10. C/C++ Windows API——获取计算机信息 转

    转自:http://blog.csdn.net/chy555chy/article 函数 头文件 作用 GetVersionEx <windows.h> 获取系统版本信息(deprecat ...