poj 2185 Milking Grid(二维KMP+next循环节)

本文介绍了一种解决二维字符矩阵循环节问题的有效算法。该算法通过将二维矩阵转化为一维进行处理,分别求解横向和纵向的循环节,进而找到最小循环单位。

Milking Grid

Time Limit: 3000MS Memory Limit: 65536K
Total Submissions: 9708 Accepted: 4230

Description

Every morning when they are milked, the Farmer John's cows form a rectangular grid that is R (1 <= R <= 10,000) rows by C (1 <= C <= 75) columns. As we all know, Farmer John is quite the expert on cow behavior, and is currently writing a book about feeding behavior in cows. He notices that if each cow is labeled with an uppercase letter indicating its breed, the two-dimensional pattern formed by his cows during milking sometimes seems to be made from smaller repeating rectangular patterns. 

Help FJ find the rectangular unit of smallest area that can be repetitively tiled to make up the entire milking grid. Note that the dimensions of the small rectangular unit do not necessarily need to divide evenly the dimensions of the entire milking grid, as indicated in the sample input below. 
 

Input

* Line 1: Two space-separated integers: R and C 

* Lines 2..R+1: The grid that the cows form, with an uppercase letter denoting each cow's breed. Each of the R input lines has C characters with no space or other intervening character. 

Output

* Line 1: The area of the smallest unit from which the grid is formed 

Sample Input

2 5
ABABA
ABABA

Sample Output

2

Hint

The entire milking grid can be constructed from repetitions of the pattern 'AB'.、、

题意:给一个R*C的二维字符矩阵A,然后让你找到一个面积最小的二维矩阵B,满足B循环铺开若干次之后就能得到A。

注意本题中循环铺开也不需要完整循环。例如

ABABA

ABABA

就可以看作是AB在X方向上循环了2.5次,在Y方向上循环了2次得到的。

这道题也是找循环节,允许循环不完整。但是与之前的题目最大的区别是这道题是二维的。解决这道题的关键是意识到二维矩阵的循环实际上在2个维度上是独立的,可以分别计算。

比如我们先处理X方向上的循环节,就可以把矩阵的每一列看成一个“字符“,只不过这个”字符“实际上是一个字符R元组。这样整个矩阵就可以看成是包含C个”字符“的”字符串“。然后我们求这个”字符串“的循环节就可以得到X方向的循环节长度。当然在这种情况下,比较两个”字符“相等的方法是比较两个R元组是不是完全相等。

对于Y方向的循环节也可以用类似的方法:把一行C元组看成一个“字符“,然后在R个”字符“的字符串上找循环节。最后两维的循环节长度相乘就是答案。

#include <stdio.h>
#include <iostream>
using namespace std;
const int maxn=10000+10;
int nt[maxn],r,c;
char a[maxn][100];
bool isR(int x,int y)
{
    for (int i=0;i<r;i++)
        if(a[i][x]!=a[i][y]) return false;
    return true;
}
bool isC(int x,int y)
{
    for (int i=0;i<c;i++)
       if(a[x][i]!=a[y][i]) return false;
    return true;
}
int main ()
{
    while(scanf("%d%d",&r,&c)!=EOF)
    {
        for (int i=0;i<r;i++)
            scanf("%s",a[i]);
        nt[0]=-1;
        int k=-1;
        for (int i=1; i<c; i++)
        {
            while(k>-1&&!isR(k+1,i)) k=nt[k];
            if(isR(k+1,i)) k++;
            nt[i]=k;
        }
        int ans=c-k-1;
        k=-1;
        for (int i=1;i<r;i++)
        {
            while(k>-1&&!isC(k+1,i)) k=nt[k];
            if(isC(k+1,i)) k++;
            nt[i]=k;
        }
        ans*=r-k-1;
        printf("%d\n",ans);
    }
    return 0;
}

 

【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究(Matlab代码实现)内容概要:本文围绕“评估多目标跟踪方法”,重点研究9个高度敏捷目标在编队飞行中的轨迹生成与测量过程,并提供完整的Matlab代码实现。文中详细模拟了目标的动态行为、运动约束及编队结构,通过仿真获取目标的状态信息与观测数据,用于验证和比较不同多目标跟踪算法的性能。研究内容涵盖轨迹建模、噪声处理、传感器测量模拟以及数据可视化等关键技术环节,旨在为雷达、无人机编队、自动驾驶等领域的多目标跟踪系统提供可复现的测试基准。; 适合人群:具备一定Matlab编程基础,从事控制工程、自动化、航空航天、智能交通或人工智能等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于多目标跟踪算法(如卡尔曼滤波、粒子滤波、GM-CPHD等)的性能评估与对比实验;②作为无人机编队、空中交通监控等应用场景下的轨迹仿真与传感器数据分析的教学与研究平台;③支持对高度机动目标在复杂编队下的可观测性与跟踪精度进行深入分析。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注轨迹生成逻辑与测量模型构建部分,可通过修改目标数量、运动参数或噪声水平来拓展实验场景,进一步提升对多目标跟踪系统设计与评估的理解。
本软件实现了一种基于时域有限差分法结合时间反转算法的微波成像技术,旨在应用于乳腺癌的早期筛查。其核心流程分为三个主要步骤:数据采集、信号处理与三维可视化。 首先,用户需分别执行“WithTumor.m”与“WithoutTumor.m”两个脚本。这两个程序将在模拟生成的三维生物组织环境中进行电磁仿真,分别采集包含肿瘤模型与不包含肿瘤模型的场景下的原始场数据。所获取的数据将自动存储为“withtumor.mat”与“withouttumor.mat”两个数据文件。 随后,运行主算法脚本“TR.m”。该程序将加载上述两组数据,并实施时间反转算法。算法的具体过程是:提取两组仿真信号之间的差异成分,通过一组专门设计的数字滤波器对差异信号进行增强与净化处理,随后在数值模拟的同一组织环境中进行时间反向的电磁波传播计算。 在算法迭代计算过程中,系统会按预设的周期(每n次迭代)自动生成并显示三维模拟空间内特定二维切面的电场强度分布图。通过对比观察这些动态更新的二维场分布图像,用户有望直观地识别出由肿瘤组织引起的异常电磁散射特征,从而实现病灶的视觉定位。 关于软件的具体配置要求、参数设置方法以及更深入的技术细节,请参阅软件包内附的说明文档。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值