首页 > 其他分享 >Checking the Text 文本校对

Checking the Text 文本校对

时间:2024-09-04 18:28:05浏览次数:10  
标签:文本校对 num Checking Text len int ch ull 文本

Checking the Text 文本校对

[POJ 2758] && [BZOJ 2258] && [NFLSOJ - 文本校对]

题面

描述

为了给Wind买生日礼物,Jiajia不得不找了一份检查文本的工作。这份工作很无聊:给你一段文本
要求比对从文本中某两个位置开始能匹配的最大长度是多少。但比无聊更糟糕的是,Jiajia的经理
还可能往文本里面插入一些字符。
Jiajia想用一个程序来解决这些繁琐的工作。这个程序的速度要足够快,因为Wind的生日就快要到了
Jiajia必须赚到足够多的钱,也就是处理足够多的文本。

输入

输入文件第一行是原始文本。
输入文件第二行是操作数n。此后n行,每行描述一条命令,命令有两种形式:
I ch p:表示将一个字符ch插入到当前文本的第p个字符之前,如果p大于当前文本长度则表示插入到当前文本末尾;
Q i j:表示询问当前文本从原始文本的第i个和第j个字符现在所在的位置开始能匹配的字符是多少。
你可以认为文本初始长度不超过50000,I命令最多200条,Q命令最多20000条。

输出

对于每条Q命令输出一行,为最长匹配长度。

样例输入

abaab
5
Q 1 2
Q 1 3
I a 2
Q 1 2
Q 1 3

样例输出

0
1
0
3

Solution

对于操作 1 :由于插入的操作量较少,可以直接暴力插入
对于操作 2 :实际是求 LCP ,那么满足二分性质:存在一分界点,使得分界点前字符都相匹配,分界点后都不匹配。因而二分找位置即可。
对于字符,可以转为哈希值储存,以便于后续操作,同时推导出区间哈希公式:h[l ~ r] = h[r] - h[l - 1] * pw[r - l + 1]. 其中 pw 为对应数乘过 P(进制数) 的次数。
num[i] 记录 i 在原序列中的位置, p[i] 记录 i 在受多次插入字符影响而改变后的位置。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

#define ull unsigned long long

using namespace std;

const int N = 5e4 + 210, P = 13331;
int n, len;
char str[N];
int p[N], num[N], a[N];
ull pw[N];
ull h[N];

inline ull check (ull l, ull r)
{
    return h[r] - h[l - 1] * pw[r - l + 1];
}

signed main()
{
    scanf ("%s", str + 1);
    len = strlen (str + 1);
    
    pw[0] = 1;
    for (int i = 1;i <= 50000;i ++ )
    {
        pw[i] = pw[i - 1] * P;
    }
    
    for (int i = 1;i <= len;i ++ )
    {
        p[i] = i, num[i] = i;
        a[i] = str[i] - 'a' + 1;
        h[i] = h[i - 1] * P + a[i];
    }
    
    scanf ("%d", &n);
    
    while (n -- )
    {
        char ch;
        int x, y;
        
        cin >> ch;
        if (ch == 'Q')
        {
            scanf ("%d%d", &x, &y);
            
            x = p[x], y = p[y];
            
            int l = 0, r = len - max (x, y) + 2;
            while (l + 1 < r)
            {
                int mid = (l + r) >> 1;
                if (check (x, x + mid - 1) == check (y, y + mid - 1))
                {
                    l = mid;
                }
                else
                {
                    r = mid;
                }
            }
            
            printf ("%d\n", l);
        }
        else
        {
            scanf (" %c %d", &ch, &x);
            if (x > len)
            {
                a[ ++ len] = ch - 'a' + 1;
            }
            else
            {
                len ++ ;
                for (int i = len;i > x;i -- )
                {
                    a[i] = a[i - 1];
                    num[i] = num[i - 1];
                    p[num[i]] ++ ;
                }
                
                a[x] = ch - 'a' + 1;
                num[x] = 0;
            }
            
            for (int i = x;i <= len;i ++ )
            {
                h[i] = h[i - 1] * P + a[i];
            }
        }
    }
    
    return 0;
}

ps:很菜的孩子写的个人理解,如有错误感谢指正!

标签:文本校对,num,Checking,Text,len,int,ch,ull,文本
From: https://www.cnblogs.com/whzboke/p/18396961

相关文章

  • Android经典实战之Textview文字设置不同颜色、下划线、加粗、超链接等效果
    本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点SpannableString在Android开发中是一个非常强大的工具,它允许你在单个字符串范围内应用多种样式。使用SpannableString,你可以为文本中的不同部分设置不同颜色,字体大小,字体......
  • c#判断右键菜单(ContextMenuStrip)是从哪个控件弹出来的方法
    1.方法一:在contextMenuStrip1打开时获取控件名称双击contextMenuStrip1在它的opening事件中写入下面的代码:privatevoidcontextMenuStrip1_Opening(objectsender,CancelEventArgse){stringwhichcontrol_name=(senderasContextMenuStrip).So......
  • WPF Customize Button ControlTemplate TextBlock
    //xaml<UserControlx:Class="WpfApp332.BtnTbk"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="......
  • RenderTexture播放视频画面残留
    问题描述:项目中使用Unity提供的VideoPlayer组件播放视频,在Assets下创建了一个RenderTexture作为媒介,将其拖拽赋值给RawImage和VideoPlayer组件的targetTexture属性即可在UI播放视频,但是使用过程中发现,切换视频播放,每次开始播放视频时,前一帧都会先显示上次视频播放的内容。运......
  • 10.2 CANYONING TECHNIQUE :DOUBLE CHECKING
    CONTENT10.2DOUBLECHECKINGOVERVIEWWATCHTHEVIDEOLESSONeBook:DoublecheckingSCENARIOSScenario1Scenario2PERSONALRESPONSIBILITYExample1Example2SUMMARY10.2DOUBLECHECKINGTEAMWORKOVERVIEWAsthesayinggoes:“oldh......
  • OpenCV绘图函数(14)图像上绘制文字的函数putText()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述在图像上绘制指定的文本字符串。cv::putText函数在图像上绘制指定的文本字符串。无法使用指定字体渲染的符号会被问号(?)替换。关于文本渲染的具体示例可以参考getTextSize函数......
  • 【Material-UI】Text Field中的 Performance 优化详解
    文章目录一、TextField组件概述1.组件介绍2.性能挑战二、全局样式注入行为的优化1.问题的根源2.禁用全局样式注入3.自定义全局样式三、实际场景中的性能优化应用1.大规模表单中的优化2.动态表单生成中的优化3.提升用户体验四、最佳实践与注意事项1.谨慎使......
  • CSS3 文本效果(text-shadow,box-shadow,white-space等)文本溢出隐藏并且显示省略号
    一text-shadowtext-shadow属性是CSS3中用于为文本添加阴影效果的工具。它可以增强文本的可读性和视觉吸引力,提供丰富的视觉效果1语法text-shadow:offset-xoffset-yblur-radiuscolor;offset-x:阴影相对于文本的水平偏移量。可以是正值(向右偏移)或负值(向左偏移)。o......
  • 【python】PyQt5中富文本框QTextEdit的详细教程与应用实战
    ✨✨欢迎大家来到景天科技苑✨✨......
  • [Paper Reading] ControlNet: Adding Conditional Control to Text-to-Image Diffusio
    ControlNet:AddingConditionalControltoText-to-ImageDiffusionModelslink时间:23.11机构:StandfordTL;DR提出ControlNet算法模型,用来给一个预训练好的text2image的diffusionmodel增加空间条件控制信息。作者尝试使用5w-1M的edges/depth/segmentation/pose等信息训练Co......