kuangbin 简单搜索 - POJ - 3087 Shuffle'm Up(模拟)
题意:
给定两个长度均为len的字符串s1、s2和一个长度为len×2的字符串s,
每一次我们按照编织字符串的操作将s1和s2拼接起来(得到长度为len×2的字符串s’
然后令s1为s’的前一半,s2为s’的后一半,反复以上操作。
若在某一次中s’和s相等则结束循环。
假设有s1=“JNU”,s2=“ACM”,s=“NAMJUC”
第一次操作后得到s’=“AJCNMU”,与s不相等。
令s1=“AJC”,s2=“NMU”
第二次操作后得到s’=“NAMJUC”,与s相等,结束循环。
输出操作次数为2
题解: 题意已经很明显了,直接暴力模拟就可以了。用搜索的方法待更新,稍后补
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
//#define int ll
#define INF 0x3f3f3f3f
using namespace std;
int read()
{
int w = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar(); }
return s * w;
//最大公约数
}int gcd(int x,int y) {
if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
//递归终止条件千万不要漏了,辗转相除法
return x % y ? gcd(y, x % y) : y;
}
int lcm(int x,int y)//计算x和y的最小公倍数
{
return x * y / gcd(x, y);//使用公式
}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
const int N = 110;
char a[N],b[N],s[N+N],c[N+N];
int n, cnt = 1;
int ans;
int main()
{
int t;
scanf("%d",&t);
while (t--) {
scanf("%d",&n);
scanf("%s",a+1);
scanf("%s",b+1);
scanf("%s",s+1);
int flag1 = 1;
for (int i = 1; i <= n + n && flag1; ++i ) {
for(int j = 1, k = 1; j <= n; ++j,k+=2) {
c[k] = b[j];
c[k + 1] = a[j];
}
int flag2 = 1;
for (int j = 1; j <= n + n && flag2; ++j) {
if (s[j] != c[j])
flag2 = 0;
}
if(flag2)
flag1 = 0, ans = i;
for (int j = 1; j <= n; ++j) {
a[j] = c[j];
b[j] = c[j + n];
}
}
if(flag1)
printf("%d %d\n", cnt++, -1);
else
printf("%d %d\n", cnt++, ans);
}
return 0;
}