作者:进击攻城狮
个人主页:欢迎访问我的主页
首发时间:2022年8月31日星期三
订阅专栏:刷题
个人信条:星光不问赶路人,岁月不负有心人。
如果文章有错误,欢迎在评论区指正。
🎉 支持我:点赞👍+收藏⭐️+留言📝
文章目录
776. 字符串移位包含问题
对于一个字符串来说,定义一次循环移位操作为:将字符串的第一个字符移动到末尾形成新的字符串。
给定两个字符串 s1s1 和 s2s2,要求判定其中一个字符串是否是另一字符串通过若干次循环移位后的新字符串的子串。
例如 CDAA
是由 AABCD
两次移位后产生的新串 BCDAA
的子串,而 ABCD
与 ACBD
则不能通过多次移位来得到其中一个字符串是新串的子串。
输入格式
共一行,包含两个字符串,中间由单个空格隔开。
字符串只包含字母和数字,长度不超过 3030。
输出格式
如果一个字符串是另一字符串通过若干次循环移位产生的新串的子串,则输出 true
,否则输出 false
。
输入样例:
AABCD CDAA
输出样例:
true
// #include <iostream>
// #include <algorithm>
// using namespace std;
// int main()
// {
// string a, b;
// cin >> a >> b;
// if (a.size() < b.size()) swap(a, b);
// for (int i = 0; i < a.size(); i ++ )
// {
// a = a.substr(1) + a[0];
// for (int j = 0; j + b.size() <= a.size(); j ++ )
// {
// int k = 0;
// for (; k < b.size(); k ++ )
// if (a[j + k] != b[k])
// break;
// if (k == b.size())
// {
// puts("true");
// return 0;
// }
// }
// }
// puts("false");
// return 0;
// }
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
string a,b;
cin>>a>>b;
if(a.size()<b.size())swap(a,b);
for(int i=0;i<a.size();i++)
{
a=a.substr(1)+a[0];
for(int j=0;j+b.size()<=a.size();j++)
{
int k=0;
for(;k<b.size();k++)
if(a[j+k]!=b[k])
break;
if(k==b.size())
{
puts("true");
return 0;
}
}
}
puts("false");
return 0;
}
777. 字符串乘方
给定两个字符串 aa 和 bb,我们定义 a×ba×b 为他们的连接。
例如,如果 a=a=abc
而 b=b=def
, 则 a×b=a×b=abcdef
。
如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=a0=``(空字符串),a(n+1)=a×(an)a(n+1)=a×(an)。
输入格式
输入包含多组测试样例,每组测试样例占一行。
每组样例包含一个字符串 ss,ss 的长度不超过 100100。
最后的测试样例后面将是一个点号作为一行。
输出格式
对于每一个 ss,你需要输出最大的 nn,使得存在一个字符串 aa,让 s=ans=an。
输入样例:
abcd
aaaa
ababab
.
输出样例:
1
4
3
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
while(cin>>str,str!=".")
{
int len=str.size();
for(int i=len;i;i--)
if(len%i==0){
int m=len/i;
string r=str.substr(0,m);
string s;
for(int j=0;j<i;j++){
s+=r;
}
if(s==str){
cout<<i<<endl;
break;
}
}
}
return 0;
}
778. 字符串最大跨距
有三个字符串 S,S1,S2S,S1,S2,其中,SS 长度不超过 300300,S1S1 和 S2S2 的长度不超过 1010。
现在,我们想要检测 S1S1 和 S2S2 是否同时在 SS 中出现,且 S1S1 位于 S2S2 的左边,并在 SS 中互不交叉(即,S1S1 的右边界点在 S2S2 的左边界点的左侧)。
计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2S2 的起始点与最左边的 S1S1 的终止点之间的字符数目)。
如果没有满足条件的 S1S1,S2S2 存在,则输出 −1−1。
例如,S=S= abcd123ab888efghij45ef67kl
, S1=S1= ab
, S2=S2= ef
,其中,S1S1 在 SS 中出现了 22 次,S2S2 也在 SS 中出现了 22 次,最大跨距为:1818。
输入格式
输入共一行,包含三个字符串 S,S1,S2S,S1,S2,字符串之间用逗号隔开。
数据保证三个字符串中不含空格和逗号。
输出格式
输出一个整数,表示最大跨距。
如果没有满足条件的 S1S1 和 S2S2 存在,则输出 −1−1。
输入样例:
abcd123ab888efghij45ef67kl,ab,ef
输出样例:
18
#include<iostream>
using namespace std;
int main()
{
string s,s1,s2;
char c;
while(cin>>c,c!=',')s+=c;
while(cin>>c,c!=',')s1+=c;
while(cin>>c)s2+=c;
if(s.size()<s1.size()||s.size()<s2.size())
puts("-1");
else{
int l=0;
while(l+s1.size()<=s.size())
{
int k=0;
while(k<s1.size())
{
if(s[l+k]!=s1[k])break;
k++;
}
if(k==s1.size())break;
l++;
}
int r=s.size()-s2.size();
while(r>=0)
{
int k=0;
while(k<s2.size())
{
if(s[r+k]!=s2[k])break;
k++;
}
if(k==s2.size())break;
r--;
}
l+=s1.size()-1;
if(l>=r)puts("-1");
else printf("%d\n",r-l-1);
}
return 0;
}
779. 最长公共字符串后缀
给出若干个字符串,输出这些字符串的最长公共后缀。
输入格式
由若干组输入组成。
每组输入的第一行是一个整数 NN。
NN 为 00 时表示输入结束,否则后面会继续有 NN 行输入,每行是一个字符串(字符串内不含空白符)。
每个字符串的长度不超过 200200。
输出格式
共一行,为 NN 个字符串的最长公共后缀(可能为空)。
数据范围
1≤N≤2001≤N≤200
输入样例:
3
baba
aba
cba
2
aa
cc
2
aa
a
0
输出样例:
ba
a
#include<iostream>
using namespace std;
const int N=200;
int n;
string str[N];
int main()
{
while(cin>>n,n)
{
int len=1000;
for(int i=0;i<n;i++)
{
cin>>str[i];
if(len>str[i].size()) len=str[i].size();
}
while(len)
{
bool success=true;
for(int i=1;i<n;i++)
{
bool is_same=true;
for(int j=1;j<=len;j++)
if(str[0][str[0].size()-j]!=str[i][str[i].size()-j])
{
is_same=false;
break;
}
if(!is_same)
{
success=false;
break;
}
}
if(success)break;
len--;
}
cout<<str[0].substr(str[0].size()-len)<<endl;
}
return 0;
}