您的位置:首页 > 其它

校赛 选修课网址 1096: Is The Same?(kmp或者find)

2016-05-11 21:54 337 查看
1096: Is The Same?

Time Limit: 1 Sec Memory Limit: 64 MB

Submit: 30 Solved: 11

[Submit][Status][Web Board]

Description

给出2个字符串S和T,如果可以通过循环移位使得S和T相等,则我们称S和T是同构字符串, 例如S=“abcd”, T=“bcda”,则S和T是同构字符串;而S=“abcd”和T=“bcad”则不是同构字符串。

循环移位是指:在⼀个长度为n的字符串S中,取⼀个任意下标i,把字符串分为两段,分别为 S1S2...Si 和Si+1Si+2...Sn,然后把字符串变为Si+1Si+2...SnS1S2...Si,例如S=“qwerty”,取i=3, 则变 为”rtyqwe”(注意,一个字符串本⾝身也算是它的同构字符串)。

Input

第⼀行包含一个整数T(1 <= T <= 20),代表测试组数。

对于每组数据,包含2个字符串,字符串长度都小于等于105且非空,输入保证字符串只包含小写字⺟。

Output

对于每组数据,如果这两个字符串是同构字符串,则输出Yes,否则输出No。

Sample Input

2

abcd

bcda

abcd

bcad

Sample Output

Yes

No

HINT

Source

Alex@NBUT

将原字符串m重复两次 在新的字符串中查找是否有n 就像一串珠子 与边上的珠子都相对确定

#include<iostream>
#include<cstring>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
int main()
{
string n,m,nn,mm;
long long a,b,i,k;
cin>>a;
while(a--)
{
cin>>n>>m;
k=5;
if(n.size()!=m.size())
{
k=0;
}
nn=n+n;
mm=m+m;
if((nn.find(m)!=string::npos||mm.find(n)!=string::npos)&&k)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
mm="";
nn="";
}
return 0;
}

/*kmp
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int nexta[1000100];
void getnext(string n)
{
int i=0,j=-1;
nexta[0]=-1;
while(i<n.size())
{
if(j==-1||n[i]==n[j])
{
++i;
++j;
nexta[i]=j;
}
else j=nexta[j];
}
}
long long kmp(string n,string m)
{
int i=0,j=0;
while(i<n.size())
{
if(j==-1||n[i]==m[j])
{
++i;
++j;
}
else j=nexta[j];
if(j==m.size())
{
return 3;
}
}
return 0;
}
int main()
{
string n,m,nn,mm;
long long a,b,c,i,d,k;
cin>>a;
while(a--)
{
memset(nexta,0,sizeof(nexta));
k=5;
cin>>n>>m;
nn=n+n;
if(n.size()!=m.size())
{
k=0;
}
getnext(m);
if(kmp(nn,m)&&k)
{
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
return 0;
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: