UVA-10391(字符串检索)

题意:

给定一个字典,要求找出所有的复合词;

思路:

用map把词都存起来,再把词拆开看是否是出现过的单词;

AC代码:

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));

typedef  long long LL;

template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<‘0‘||CH>‘9‘;F= CH==‘-‘,CH=getchar());
    for(num=0;CH>=‘0‘&&CH<=‘9‘;num=num*10+CH-‘0‘,CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + ‘0‘);
    putchar(‘\n‘);
}

const LL mod=1e9+7;
const double PI=acos(-1.0);
const int inf=1e9;
const int N=12e4+10;
const int maxn=1e3+10;
const double eps=1e-10;

int n;
string s[N];
map<string,int>mp;
int main()
{
        int cnt =0;
        while(cin>>s[++cnt])
        {
            mp[s[cnt]]=1;
        }
        string a,b;
        For(i,1,cnt)
        {
            int len=s[i].size();
            For(j,0,len-1)
            {
                a=s[i].substr(0,j+1);
                b=s[i].substr(j+1);
                if(mp[a]&&mp[b])
                {
                    cout<<s[i]<<"\n";
                    break;
                }
            }
        }
        return 0;
}
时间: 2024-11-05 14:57:52

UVA-10391(字符串检索)的相关文章

uva 10391 Compound Words (字符串-hash)

Problem E: Compound Words You are to find all the two-word compound words in a dictionary. A two-word compound word is a word in the dictionary that is theconcatenation of exactly two other words in the dictionary. Input Standard input consists of a

大规模字符串检索-压缩trie树

本文使用压缩trie树实现字符串检索的功能.首先将字符串通过编码转化为二进制串,随后将二进制串插入到trie树中,在插入过程中同时实现压缩的功能. 字符编码采用Huffman,但最终测试发现不采用Huffman的方法不仅省下了编码时间,同时trie树的插入时间也有所减少. 1 /** 2 程序主函数与编码 3 */ 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include &q

UVa 10340 字符串基础

背景:小紫书习题,开始数组开小了runtime error了一次,显然数组越界.复杂度:O(max(A的长度,B的长度)). 题意:看字符串A是不是字符串B的子串.直接顺序扫描即可. #include<stdio.h> #include<string.h> char str[1000000],ttr[1000000]; int main(void){ while(scanf("%s %s",str,ttr)!=EOF){ int j=0,sj=strlen(st

UVa 10391 (水题 STL) Compound Words

今天下午略感无聊啊,切点水题打发打发时间,=_=|| 把所有字符串插入到一个set中去,然后对于每个字符串S,枚举所有可能的拆分组合S = A + B,看看A和B是否都在set中,是的话说明S就是一个复合词. 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <string> 6 #include <

UVa 232 字符串处理、

背景:做了三个半小时,代码能力堪忧啊,各种调试,各种出错,要分析一下,这些错点尽量不能再错. 学习:1.对于字符串数组,要把每一行都开大一位,该位用来存放'\0',否则将会出现未知输出.也就是说:字符串二维数组的每一行都可以看做一个字符数组,结尾都有一个'\0'.printf在用'%s'格式符输出字符串,总是从给定的首地址开始,遇到'\0'结束. 2.写程序的时候要有动态的眼光来看待当前写下的代码运行时的样子.运行出错不要理解单步调试,因先猜测是哪里错了,先看代码在脑中模拟. #include<

UVa 12206 (字符串哈希) Stammering Aliens

体验了一把字符串Hash的做法,感觉Hash这种人品算法好神奇. 也许这道题的正解是后缀数组,但Hash做法的优势就是编码复杂度大大降低. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int maxn = 40000 + 10; 7 const int x = 123; 8 int n, m, pos; 9 unsigne

实现字符串检索strstr函数、字符串长度strlen函数、字符串拷贝strcpy函数

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 /* 6 _Check_return_ _Ret_maybenull_ 7 inline char* __CRTDECL strstr(_In_z_ char* const _String, _In_z_ char const* const _SubString) 8 { 9 return const_cast<char*>

UVA 1585 字符串处理

背景:小紫书上习题 学习:1.条件运算符?:: 的运用可以简化,高效代码.?的优先级大于=,小余算术和关系运算符.与多重赋值语句一样采用右结合.(用到了dp的思想) 代码: #include<stdio.h> #include<string.h> int main(void){ int num[80]; char str[81]; int t; scanf("%d",&t); while(t--){ int sum = 0; scanf("%s

UVA - 10391

Problem E: Compound Words You are to find all the two-word compound words in a dictionary. A two-word compound word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary. Input Standard input consists of a

uva 10391 Compound Words

题目:给定一个单词本,要求找出其中的单词,是单词本中某两个单词合并起来得. 思路.先把单词本用字典树保存,然后枚举没个单词的切点,把一个单词分成两部分,去字典树中找即可. #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define inf (0x3f3f3f3f)