题目: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. CentOS查看线程、硬盘、内存、cpu、网卡

    1.查看硬盘 [mushme@investide ~]$ df -ah 2.查看内存 [mushme@investide ~]$ free -m 3.监控系统的负载 w    查看当前系统的负载,详细 ...

  2. UVa 11582 - Colossal Fibonacci Numbers!(数论)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. 交叉熵Cross-Entropy

    1.交叉熵:用来描述通信中将一个概率分布的最优编码用到另一个概率分布的平均比特数 公式: 2.交叉熵是不对称的 3.交叉熵的作用是表达两个概率分布的差异性 设概率分布p(x)和q(x),两个概率分布差 ...

  4. tensorflow的一些函数

    1.tf.constant(value,dtype=None,shape=None,name='Const') 注意这个函数创造的是一个常数tensor,而不是一个具体的常数 value:即可以是li ...

  5. 用@ExceptionHandler 来进行异常处理

    有时候我们想统一处理一个Controller中抛出的异常怎么搞呢? 直接在Controller里面加上用@ExceptionHandler标注一个处理异常的方法像下面这样子 @ExceptionHan ...

  6. web项目继承ServletContainerInitializer进行访问HttpServlet(WebServlet)

    java使用web项目不需要加web.xml 配置javax.servlet.ServletContainerInitializer 1.在src目录创建META-INF,META-INF目录下创建s ...

  7. 【题解】洛谷P4391 [BOI2009] Radio Transmission(KMP)

    洛谷P4391:https://www.luogu.org/problemnew/show/P4391 思路 对于给定的字符串 运用KMP思想 设P[x]为前x个字符前缀和后缀相同的最长长度 则对于题 ...

  8. CSU - 2059 Water Problem(Z线分割平面)

    一条‘Z’形线可以将平面分为两个区域,那么由N条Z形线所定义的区域的最大个数是多少呢?每条Z形线由两条平行的无限半直线和一条直线段组成 Input 首先输入一个数字T(T<100),代表有T次询 ...

  9. bit and sbit---c51

    bit和sbit都是C51扩展的变量类型. bit和int char之类的差不多,只不过char=8位, bit=1位而已.都是变量,编译器在编译过程中分配地址.除非你指定,否则这个地址是随机的.这个 ...

  10. 【译】为什么要写super(props)

    译注: 原文地址 https://overreacted.io/why-do-we-write-super-props/ 正文 我听说Hooks是新的热点.好笑的是,我想通过描述一些关于class组件 ...