题目来源
https://codeforces.com/problemset/problem/1553/B
题外话:
最近也打了不少比赛,但是总体进步不高,就觉得是自己的方法有点问题。
就打过的比赛,会的题,一般十分内就写出来了,不会的题,只要看着第一时间没有思路,就一定做不出来(哈哈哈哈,我先笑自己一会儿)
事后虽然有补题,但是那些稍稍高出自己水平的题,自己还是看了题解之后,才一点点理解的。总而言之,就是自己不会的题,做的太少。
所以我决定改变策略,我也是最近才发现,cf上可以搜索相应难度的题目。
所以最近几天坚持只做1000-1500的题目,看看思路是否可以有提升。lmy加油鸭~
题目大意
有一个字符串,你可以在这个字符串的任意位置放置一个芯片。你可以将芯片向右移动任意个单位,或向左移动任意个单位。但是注意,若芯片已经在最右边了,则无法再向右移动,向左亦如此。
这个时候,你将你放置芯片和你移动芯片时,芯片位置对应的字母写下来得到一个新的字符串。
问,给出两个字符串,一个s,一个t,t能否是s通过以上操作得到的。
我的思路
题目的名字起的很有意思,反转字符串。
t其实就是从字符串头元素,到放置芯片的初始位置,这一段的字符串+它的反转字符串。
(我的语言表达能力不太好,直接上代码吧,我觉得代码更好懂)
分类
思维,字符串的基本操作
我的代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
string a, b;
cin >> t;
while (t--)
{
int flag = 0;
cin >> a >> b;
for (int i = 0; i < a.size(); i++)
{
string a1 = a.substr(0, 1 + i), a2 = a.substr(0, i);
reverse(a2.begin(), a2.end());
a1 = a1 + a2;
if (a1.find(b)!=-1)
{
flag = 1;
break;
}
}
cout << (flag ? "YES" : "NO") << "\n";
}
return 0;
}
关于此题的总结
substr函数:
有两个参数,一个是起始位置,一个是终止位置,要注意:
string a="abcdef";
b=a.substr(0,3);
b是:“abc”而不是“abcd”
find函数:
find函数的返回值是无符号整型,如果查找不到,就会返回-1或4294967295
所以能够找到是a.find©!=-1
reverse函数
可用于字符串的颠倒