CF有些上不了,用洛谷链接代替传送
这道题还是遇到蛮多问题,虽然这对dalao来说都是水题,不过我这蒟蒻还是要总结一下所遇到的问题。
1.判断俩个字符串相等函数strcmp(str1,str2)中str1,str2为字符串首地址
开始我strcmp(string a,string b)显然错误,那如何返回string 的首个地址呢,我之前博客也有记录,调用string 中的c_str( )函数即可。
所有只要改为strcmp( a.c_str( ),b.c_str( ) ) 即可解决 CE;
顺便巩固一下strcmp的用法:
(1).strcmp(str1,str2)>0 按照字典序str1大于str2
(2).strcmp(str1,str2)==0 相等
(3).strcmp(str1,str2)<0 str1<str2
2.string中 reverse(a.begin( ),a.end( ) )
因为首次使用,直接百度了一下用法,按照自己理解就开始用,然后就CE
,哭了 。
我是这样用的:
3.insert(int pos,string a)
首次使用,正确运用,hhhhhh
string a="China";
string temp=reverse(a,a+n);//错的
下面为正确用法:
string a="china";
string temp=a;
reverse(temp,temp+5);
下面为正确代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
string word;//字符串
int flag;//标记是否已经用过
}a[105];
string ans;//用来输出
int main()
{
int n,m;//这道题 m 对我来说没有什么~~B~~ 用
cin>>n>>m;
getchar();
for(int i=0;i<n;i++)
cin>>a[i].word;
for(int i=0;i<n;i++)
{
if(!a[i].flag)
{
for(int j=i+1;j<n;j++)//枚举i后面字符串是否对称
{
string temp=a[j].word;
reverse(temp.begin(),temp.end());
if(strcmp(a[i].word.c_str(),temp.c_str())==0)
{
ans=a[i].word+ans+a[j].word;
a[i].flag=a[j].flag=1;
}
}
}
}
for(int i=0;i<n;i++)
{
if(!a[i].flag)
{
string temp=a[i].word;
reverse(temp.begin(),temp.end());
if(strcmp(temp.c_str(),a[i].word.c_str())==0)
{
ans.insert(ans.size()/2,a[i].word);//插入自身对称的字符串(回文串)
break;
}
}
}
cout<<ans.size()<<"\n";
cout<<ans<<endl;
return 0;
}
来源:CSDN
作者:卑微求AC
链接:https://blog.csdn.net/ACMjiayou/article/details/104654527