F. Strings and Queries
time limit per test

2.5 s

memory limit per test

256 MB

input

standard input

output

standard output

You are given a set of n strings such that all characters in the strings are 'a', 'b', or 'c'.

Also, you are given q queries, such that each query consisting of two strings a and b. The answer of each query is the index of the string with the most number of palindrome substrings between strings a and b from the given set.

A substring of the string s is a sequence sl, sl + 1, ..., sr for some integers (l, r) such that (1 ≤ l ≤ r ≤ n), where n is the length of the string s.

A palindrome is a word, phrase, number, or other sequence of characters which reads the same backward as forward, such as "madam" or "racecar".

Input

The first line contains an integer T, where T is the number of test cases.

The first line of each test case contains two integers n and q (1 ≤ n ≤ 104) (1 ≤ q ≤ 105), where n is the number of strings, and q is the number of queries.

Then n lines follow, each line contains a non-empty string with length no more than 30, giving the strings. All characters in the strings are 'a', 'b', or 'c'. It is guaranteed that all strings are unique. The given strings are numbered from 1 to n.

Then q lines follow, each line contains two strings a and b, giving the queries. It is guaranteed that strings a and b exist in the given set of strings.

Output

For each query, print a single line containing the index of the string with the most number of palindrome substrings between the given strings a and b. If there are more than one answer, print the lowest index.

Example
Input

Copy
1
5 5
aaaaa
abaabc
cbbaca
abccba
abca
aaaaa abca
cbbaca abccba
abaabc abccba
abccba abca
abaabc abccba
Output

Copy
1
4
2
4
2
Note

As input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use scanf/printf instead of cin/cout in C++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.

这个是是一个RMQ的题目,

我分析一下我的思路,首先从学姐那里知道这个是一个RMQ的题目,然后就打开了这个模板(不太记得怎么写了),然后开始思考,这个是字符串,首先要把字符变成数字来处理,这个就需要一个数组或者map来储存它的位置,然后还要用一个map来储存每一个位置的子字符串数量,最后就是dp来储存编号,然后方便以后的储存。

之后的m次查询,每次找到它的位置在那里,然后用RMQ进行查询。

RMQ具体就是比较dp编号位置的字符回文子串的数量。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <map>
#define inf 0x3f3f3f3f
#define debug(n) printf("%d\n",n)
using namespace std;
typedef long long ll;
const int maxn = 1e4 + 100;
ll dp[maxn][30];
map < ll, ll > mp;
map<ll, ll>mm;
ll n, m; ll tras(char* s)
{
ll ans = 0;
for (int i = 0; i <s[i]; i++)//这里还是不太明白为什么这么写,有哪位大佬知道,可以告诉我一声。
{
ans = ans * 27 + s[i] - 'a' + 1;
}
return ans;
} ll getnum(char*s)
{
int len = strlen(s);
ll ans = 0;
for (int i = 0; i < len; i++)
{
for (int j = 0; i + j < len && i - j >= 0 && s[i - j] == s[i + j]; j++) ans++;
for (int j = 0; i + j < len && i - 1 - j >= 0 && s[i - 1 - j] == s[i + j]; j++) ans++;
}
return ans;
}
int max_(ll a, ll b)
{
if (mm[a] == mm[b]) return a < b ? a : b;
return mm[a] > mm[b] ? a : b;
} void RMQ()
{
for (int j = 1; (1 << j) <= n; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
dp[i][j] = max_(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
}
}
} int main()
{
int t;
cin >> t;
while (t--)
{
cin >> n >> m;
char s[100], s1[100];
mm.clear();
mp.clear();
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++)
{
scanf("%s", s);
mp[tras(s)] = i;
mm[i] = getnum(s);
dp[i][0] = i;
}
RMQ();
for (int i = 1; i <= m; i++)
{
scanf("%s%s", s, s1);
ll l = mp[tras(s)];
ll r = mp[tras(s1)];
if (l > r) swap(l, r);
ll k = (log(r - l + 1.0) / (log(2.0)));
ll num = max_(dp[l][k], dp[r - (1 << k) + 1][k]);
printf("%lld\n", num);
}
}
return 0;
}

  

RMQ 字符串 F. Strings and Queries的更多相关文章

  1. Go中的字符串使用----strings和strconv

    Go中的字符串操作 字符串是工作中最常用的,值得我们专门的练习一下.在Go中使用strings包来操作字符串,这也是内置的包哈,不像Java中要么手写,要么引入common-lang 或者 别的第三方 ...

  2. guava字符串工具 Strings 校验补全 转换null和""

    public class StringsTest { public static void main(String args[]){ //1.补右全(Strings.padEnd方法) String ...

  3. C# 6.0 内插字符串 (Interpolated Strings )

    讲Interpolated Strings之前,让我们先看EF Core 2.0 的一个新的特性:String interpolation in FromSql and ExecuteSqlComma ...

  4. [Swift]LeetCode854. 相似度为 K 的字符串 | K-Similar Strings

    Strings A and B are K-similar (for some non-negative integer K) if we can swap the positions of two ...

  5. [Swift]LeetCode205. 同构字符串 | Isomorphic Strings

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  6. [Swift]LeetCode859. 亲密字符串 | Buddy Strings

    Given two strings A and B of lowercase letters, return true if and only if we can swap two letters i ...

  7. PythonStudy——三种字符串 Three strings

    # 普通字符串:u'以字符作为输出单位'print(u'abc') # 用于显示 # 二进制字符串:b'' 二进制字符串以字节作为输出单位print(b'abc') # 用于传输 # 原义字符串:r' ...

  8. LeetCode 205:同构字符串 Isomorphic Strings

    题目: 给定两个字符串 s 和 *t*,判断它们是否是同构的. 如果 s 中的字符可以被替换得到 *t* ,那么这两个字符串是同构的. 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字 ...

  9. LeetCode 205. 同构字符串(Isomorphic Strings)

    205. 同构字符串 205. Isomorphic Strings

随机推荐

  1. SharedPreferences存储读取数据

    存储 //创建SharedPreferences 存储用户名SharedPreferences sharedPreferences = getSharedPreferences("name& ...

  2. npm 安装 卸载 模块(转载)

    来源 https://blog.csdn.net/yihanzhi/article/details/75665959 利用npm 安装删除模块 npm安装模块 [npm install xxx]利用 ...

  3. C#实现放大镜

    winform实现一个跟随鼠标移动放大功能 实现步骤: 1.创建一个Form1,一个计时器timer1和一个图片显示控件pictureBox1 2.核心代码 ;//倍率,调节放大倍数,可由TrackB ...

  4. JSTL_XML标记库

    JSTL_XML 一:说明 如有转载请标明出处 必须包含的属性->有默认值的属性->其余属性,中间用回车隔开 二:XML标记库 Xml标记库主要功能就是为在jsp页面中操作xml提供便利支 ...

  5. Java集合类源码解析:AbstractMap

    目录 引言 源码解析 抽象函数entrySet() 两个集合视图 操作方法 两个子类 参考: 引言 今天学习一个Java集合的一个抽象类 AbstractMap ,AbstractMap 是Map接口 ...

  6. (4)Microsoft office Word 2013版本操作入门_插入图片及图片的排版

    1.word中插入图片和文绕图 1.1插入图片 :点击[插入]-->[图片] 或者 [联机图片]从网上选择. 1.2文字环绕: [格式] --->点击[位置]   .[自动换行]  进行图 ...

  7. 【Java基础】16、小数的浮点型和定点型

    一.简介 1.对于不需要任何准确计算精度的数字可以直接使用浮点型,但是如果需要精确计算的结果,则必须使用定点型(BigDecimal类) 浮点型:float,double 定点型:BigDecimal ...

  8. JavaScript碎片—函数闭包(模拟面向对象)

    经过这几天的博客浏览,让我见识大涨,其中有一篇让我感触犹深,JavaScript语言本身是没有面向对象的,但是那些大神们却深深的模拟出来了面向对象,让我震撼不已.本篇博客就是在此基础上加上自己的认知, ...

  9. undefined 与 xx is not defined 的区别

    undefined 与 xx is not defined 的区别 1. undefined 表示是javascript中的一种数据类型,当被定义的变量没有被赋值或者某个被调用的函数没有定义返回值时候 ...

  10. 电脑GIF动图制作方法图文详解

    我们在电脑上可以看到很多动态图,有趣的.搞笑的.可爱的等等,只要我们要用哪种类型的,网上应有尽有,但是想不想自己制作图片呢?今天我们就来学习一下GIF动图制作的方法. 使用工具: 电脑 操作方法: 1 ...