codeforces B. Mike and strings

本文提供了 CodeForces 798B 的详细解答过程,包括了作者最初未充分考虑的循环节问题,以及通过直接处理所有可能的字符串交换情况来解决问题的方法。文章还分享了一段 C++ 代码实现,展示了如何通过排序和比较来验证解决方案的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

http://codeforces.com/problemset/problem/798/B

题解:

自己当初没怎么考虑清楚,没有考虑到循环节这个情况。直接先处理了会出现交换的所有的情况,然后直接去对所有的字符串进行比对。

代码:

#include <cstdio>
#include <stack>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 50+10;
string s1[maxn],s2[maxn];
string ans[1000+10];

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>s1[i];
    for(int i=0;i<n;i++)
            s2[i]=s1[i];
    for(int i=0;i<n;i++)
        sort(s2[i].begin(),s2[i].end());
    int flag=0;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            if(s2[i]!=s2[j])
            {
                flag=1;
                break;
            }
        }
    int len=0;
    met(ans,'\0');
    for(int i=0;i<s1[0].size();i++)
    {
        for(int j=i;j<s1[0].size();j++)
        {
            ans[len]+=s1[0][j];
        }
        for(int j=0;j<i;j++)
        {
            ans[len]+=s1[0][j];
        }
        len++;
    }
    int flag1=0;
    for(int i=1;i<n;i++)
    {
        flag1=0;
        for(int j=0;j<len;j++)
        {
            if(s1[i]==ans[j])
            {
                flag1=1;
                break;
            }
        }
        if(!flag1)
        {
            flag=1;
            break;
        }
    }
    int MIN=inf;
    int cnt=0;
    for(int i=0;i<len;i++)
    {
        cnt=0;
        for(int j=1;j<n;j++)
        {
            int xxx=inf;
            for(int k=0;k<len;k++)
            {
                if(s1[j]==ans[k])
                {
                    int xx=k-i;
                    if(xx<0)
                        xx=(-1)*xx;
                    else if(xx>0)
                        xx=s1[0].size()-xx;
                    xxx=min(xx,xxx);
                }
            }
            cnt+=xxx;
        }
        cnt+=i;
//        cout<<cnt<<endl;
        MIN=min(cnt,MIN);
    }
    if(flag)
        cout<<"-1"<<endl;
    else
        cout<<MIN<<endl;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值