字符串训练之四

https://www.luogu.org/problem/P2264

看一眼就是水题

方法应该很多,都可以乱搞出来

我就找了两个比较好的做法

一个是trie,还有一个是set

trie

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<iostream>
#include<algorithm>
#include<string>
#define rep(i,x,y) for(register int i = x;i <= y;++i)
#define repd(i,x,y) for(register int i = x;i >= y;--i)
using namespace std;
typedef long long ll;
int n,sz,ans,cnt = 1,val[1000000];
char trie[100000][27];
void trie_build(char*s,int len)
{
    int x = 0;
    rep(i,1,len) {
        if(!trie[x][s[i]]) trie[x][s[i]] = ++sz;
        x = trie[x][s[i]];
    }
    val[x] = -1;
}

bool trie_find(char*s,int len)
{
    int x = 0;
    rep(i,1,len)
    {
        if(s[i] < 'a' || s[i] > 'z' || !trie[x][s[i]]) return false;
        x = trie[x][s[i]];
    }
    if(val[x] != cnt && val[x])return val[x] = cnt,true;
    return false;
}

int main()
{
    freopen("qs.in","r",stdin);
    scanf("%d",&n);getchar();
    char s[100],c;
    int len;
    rep(i,1,n) {
        len = 0;
        while((c = getchar()) != '\n' && c != ' ') {
            if(c >= 'A' && c <= 'Z') c += 32;
            s[++len] = c;
        }
        trie_build(s,len);
    }
    len = 0;
    while((c = getchar()) != EOF)
    {
        if(c == ' ' || c == '.' || c == ',') {
            if(trie_find(s,len)) ans++;
            len = 0; if(c == '.') ++cnt;
            continue;
        }
        if(c >= 'A' && c <= 'Z') c += 32;
        s[++len] = c;
    }
    if(trie_find(s,len)) ans++;
    cout<<ans;
    return 0;
}

set

#include<bits/stdc++.h>
using namespace std;
set<string>se,se2;
int ans,n;
int main()
{
    scanf("%d",&n);
    string a;
    for(int i=1;i<=n;i++){
        cin>>a;
        for(int i=0;i<a.length();i++)
            if(a[i]>='a'&&a[i]<='z') a[i]-=32;
        se.insert(a);
    }
    char ch=getchar();
    string b;
    while(scanf("%c",&ch)==1){
        if(ch=='\n')break;
        if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')){
            if(ch>='a'&&ch<='z')ch=ch-32;
            b+=ch;
        }
        else{
            if(!b.empty()){
                if(se.count(b))se2.insert(b);
                b.clear();
            }
            if(ch=='.')ans+=se2.size(),se2.clear();
        }
    }
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/wzxbeliever/p/11624872.html

时间: 2024-10-11 02:06:52

字符串训练之四的相关文章

字符串训练之一

字符串训练 例题一 https://www.luogu.org/problem/P2292 给出 N个单词,和 M 个句子,问每个句子中包含这些单词的最长前缀是多少. 解题技巧: 提取关键字:句子......前缀..... 好的学过AC自动机的就应该知道了 但现在有要求是最长 又是个最值问题:dp?贪心? 在ac自动机中唯一能插入其他操作的只有查询fail数组的时候才行 此时问题已经解决了一大半了 核心来了 for(int y=x;y;y=fail[y]) if(is_end[y]&&ex

字符串训练之三

字符串训练三 https://www.luogu.org/problem/P4551 题目描述: 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或 分析: 嗯?这不是个图论题吗?什么狗屁字符串? 首先看到异或,那01trie树就必不可少的了 首先对一条边异或2次,相当于没有异或. 这样的话 i -> j 的异或和,就是 i -> 1 的异或和,再异或上 1 -> j 的异或和. 处理出每个点到1路

图论训练之四

https://www.luogu.org/problem/P2680 题意:n个点,n-1条边,边有边权,无向图,m条航线,0时刻同时启程,你可以将一个边权变为0,求使得最后一个航线到达最少花费时间. 这道题很早就做过了,但现在又忘了, 而且觉得这是一道好题,所以写一篇博客 分析: 首先最大值最小,二分毋庸置疑 当然是二分答案,但怎么判断就是本题的难点了 明确,删边一定是在最长的路线中删去(很好理解吧) 在此基础上 看能否有其他的路线经过删的边就更好 普及一下树上差分 如果是点差分,(a,b)

杂题训练之四

https://www.luogu.org/problem/P3650 真的是惭愧,拿到一个普及减的题,看了半天不会做,还要看题解 首先On*n的 首先对之进行排序 因为添加和减小高度都是无标准的,只要差值小于等于17就好 于是我们可以枚举一个这样的标准 小于它的变成它,大于它且大于差值大于17的,变成它 #include<cstdio> #include<algorithm> using namespace std; int a[1001],n; int sqr(int a) {

数论训练之四

https://www.luogu.org/problem/P3978 题目描述: 对于一棵随机生成的n个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢? 不同构的二叉树数目显然是卡特兰数(因为这题目描述的不同构节点标号也要不同) 节点数期望是等于(各种情况的节点数)/(不同构二叉树数目) 那怎么算各种情况的节点数之和呢?有点技巧了 考虑n-1个点现在还没连边 此时第n个点就有2(n-1)个位置可以插入 又因为实际上他们是连了n-2条边的,所以实际上只有n个位置

数据结构训练之四

https://www.luogu.org/problem/P2824#submit 做法: 由于将一个普通序列排序很慢,需要nlogn的时间,所以我们试着把它转化为对01序列排序.先来考虑一个简单的问题: 如何将一个01序列排序?(logn的复杂度) 对于这个问题,我们使用线段树来维护.查询一段区间内的1的个数记为cnt1,如果是升序,就将这段区间的[r-cnt1+1, r]都更改为1,将[l, r-cnt1]更改为0.降序则将[l, l+cnt1-1]更改为1,将[l+cnt, r]更改为0

【美妙的Python之四】标准变量类型-数字与字符串

美妙的Python之Python标准变量类型 简而言之: Python 是能你无限惊喜的语言,与众不同.         1.数字:        Python支持四种数字变量类型: int(有符号整形) long(长整形) float(浮点型) complex(复数)        数字变量用于存储数值,数字对象是不可改变对象,因此改变数字变量的值会分配一个新的对象.       如下示意图:          变量相当于便签,a=3则相当于将a便签贴到值为3的数字对象上,这样便可以通过便签a

C++ 字符串编程训练1

最近又到了找工作的时间,所以想每天抽点时间出来对编程进行相关训练.C++字符串是一个很重要的知识点,采用STL.算法等C++优于C的方面,能够使问题解决起来更加轻松.以下程序都是自己写的,可能有些地方时间效率.空间效率不高,所以希望大家能够多多讨论交流,互相提升. 题目:删除子串 说明:给定两个形参str和substr,其中str为源字符串,substr为需要删除的子串,如果str中包含substr,则将其删除并输出新的字符串,否则输出源字符串. void delete_substr(strin

蓝桥 算法训练 比较字符串

算法训练 比较字符串 Description 编程实现两个字符串s1和s2的字典序比较.(保证每一个字符串不是另一个的前缀,且长度在100以内).若s1和s2相等,输出0:若它们不相等,则指出其第一个不同字符的ASCII码的差值:如果s1>s2,则差值为正:如果s1<s2,则差值为负. Input 输入描述: 输入样例: java basic Output 输出描述: 输出样例: 8 Hint HINT:时间限制:1.0s 内存限制:512.0MB Source 蓝桥杯练习系统 ID: 170