单词

P1026 统计单词个数——substr

孤街醉人 提交于 2019-12-01 08:47:52
P1026 统计单词个数 string 基本操作: substr(x,y) x是起始位置,y是长度; 返回的是这一段字符串; 先预处理sum[i][j],表示以i开头,最多的单词数; 从后往前寻找,保证开头没有被用过; sum[i][j]=sum[i+1][j]; 再找是否有新单词出现; s.find()==0说明找到单词以开头开始; 然后dp,f[i][j]表示以i结尾分j段的最大单词数; #include<cstdio> #include<string> #include<iostream> #include<cstring> #include<algorithm> using namespace std; string s,ch,a[10]; int sum_dic,p,k; int sum[210][210]; bool check(int l,int r) { string x; x=s.substr(l,r-l+1); for(int i=1;i<=sum_dic;i++) { if(x.find(a[i])==0) return 1; } return 0; } int f[210][50]; int main() { scanf("%d%d",&p,&k); s+="0"; for(int i=1;i<=p;i++) { cin>>ch; s+=ch; } int

Kattis - nvwls (AC自动机last优化 + dp)

孤者浪人 提交于 2019-12-01 07:52:40
题意 给出一个字典,每个单词去掉元音字母 A、E、I、O、U 之后形成一个新字典。 先给出一个只有辅音组成的串,用原字典中的单词还原该串,若存在多种还原方式,输出还原后元音字母数量最多的那种,若依旧多种,则任意输出。 传送门 思路 ac自动机fail树上跑dp的一眼套路题。 总结一下遇到的坑: 多个单词去掉元音字母之后形成的新单词相同。 若原单词只有辅音字母。 dp过程中未保证完全还原辅音串。 特殊样例将 跳fail的过程卡成了 \(n^2\) 。 解决办法: 在字典树的结尾节点保存编号时,保存最大值。 将初值从 $0 $ 改为 \(-1\) 。 dp数组初值同样改为 \(-1\) , \(dp[0] = 0\) ,dp只能由非 \(-1\) 的状态转移。 对fail数组进行 last优化 。 last[u] = len[fail[u]]? fail[u]: last[fail[u]]; 。 last优化 普通方法将建图+匹配的复杂度成功优化为了 𝑂(∑𝑛+𝑚) ,但是,匹配成功时的计数也是需要跳fail边的。然而,为了跳到一个结束节点,我们可能需要中途跳到很多没用的伪结束节点: 如果一个节点的fail指向一个结尾节点,那么这个点也成为一个(伪)结尾节点。在匹配时,如果遇到结尾节点,就进行相应的计数处理。 这里面就又有优化的余地了:对于不是真正结束节点的伪结束点,直接跳过它就好了

【leetcode】字母异位词分组

扶醉桌前 提交于 2019-12-01 07:43:13
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [ ["ate","eat","tea"], ["nat","tan"], ["bat"] ] 说明: 所有输入均为小写字母。 不考虑答案输出的顺序。 分析:两个方法 1.对每个单词进行字典序排序,排序结果相同的自然是同一分组 时间复杂度:O(N*K*log K),K为最长单词长度 空间复杂度:O(N*K) 2.对每个单词按计数分类 可以采用map,也可以采用数组,建议利用素数的性质来使用数组进行计数 每个小写字符对应一个素数,素数相乘的结果和素数乘的先后顺序无关,所以对每个单词可以生成一个特征码,只要单词中的字符的数量和种类相同,那么生成的特征码也是一样的 时间复杂度:O(N*K) 空间复杂度:O(N) class Solution { public: vector<vector<string> > groupAnagrams(vector<string>& str) { int mod=1000000007; vector<vector<string> > vv; map<long long,vector<string> > mm; map<long long ,vector

NOIP 统计单词个数(区间DP)

余生长醉 提交于 2019-12-01 07:41:53
满分做法: 用 \(dp[i][j]\) 表示到 \(i\) 位置分为 \(j\) 段的最大值,区间dp通常枚举断点,所以预处理 \(sum[i][j]\) 表示区间 \([i,j]\) 的单词数。 本题还用了string类型的小技巧,推荐做一下。 #include<queue> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<cstdio> using namespace std; int p,k; string s; int dp[210][55];//dp[i][j]表示到i分为j段的最单词数 int sum[210][210]; int n; string a[8]; bool check(int l,int r)//寻找以l开头的字符串 { string x=s.substr(l,r-l+1);//裁剪 for(int i=1;i<=n;i++) if(x.find(a[i])==0) return 1;//直接找字符串,返回开头位置 return 0; } int main() { scanf("%d%d",&p,&k); s+='$';//下表从1开始 for(int i=1;i<=p;i++) { string x; cin>>x; s+=x; }

作业demo

孤人 提交于 2019-12-01 06:59:31
计算机接口的设计与实现过程: 总的设计思路在我的同伴博客:xxxxxxx 那我负责的功能模块主要是GetDic类和GetRes类及Print类这三个类。 print类主要是分辨命令行参数,判断是文本输出还是控制台输出,文本输出则使用StreamWriter这个字符流。 较为关键的则是GetDic类和GetRes类,GetDic类则是使用了dictionary集合生成具有词频的单词集合,那我通过CountWords 所得到的单词集合传入GetDic类遍历集合,第一次的存入集合,重复的词频加一,生成了一个具有词频的单词集合。 流程图 GetRes类则是使用上述getdic所产生的集合进行数据处理,同样是使用dictionary作为结果集合,我优先进行单词集合词频的统计,再由词频在已经排好字典序的单词集合中找,如果符合则添加到我的结果集合中,由Print函数输出 流程图 关键代码展示: GetDic类: //传入有countWords使用的单词集合 //得到单词以及对应的数目存入泛型数组keyValues public static Dictionary<string, int> createDic(StreamReader sr,List<string>words) { Dictionary<string, int> keyValues = new Dictionary<string,

软工第四次作业:结对编程

给你一囗甜甜゛ 提交于 2019-12-01 05:36:55
软件工程第四次作业:结对编程 GIT地址 学生姓名 吴昊阳 学号 201831083104 结对伙伴 姚志昆 伙伴学号 201831081105 伙伴博客地址 一丶 PSP表格    1.解题思路描述 要求是“统计指定单词的出现频率”,那么就是要解决两个问题: 找到指定单词和计数。我们设置了指针用来查找,在查找的同时用search进行统计计数。 刚开始,小组打算分工,分别查阅资料,思考不同阶段要求,伙伴成员协作完成。 对题目要求进行分析后,题目要求为词频统计,但是要求不少,小组决定先做基础要求。 尽量利用C++标准库的功能,利用正则表达式来提取出符合需求定义的单词, 每个单词应具有最简形式、已统计数量等属性,故采用结构体的形式存储。 行数统计:以按行读取的方式读取文本文件,每次成功读取后对应的counter+1,直至文件末尾。(统计文件的有效行数:任何包含非空白字符的行,都需要统计。) 字符数统计: 统计可打印字符个数 单词统计:根据要求,只有由至少4个英文字母打头的连续英文、数字字符串才算做一个单词,并且单词实体不区别大小写字母转换大小写; 保存字符长度>=4的单词-----------使用正则表达式;去掉开头非字符的单词并计数;排序,在自定义数据结构中重载<和<=,来实现词频排序,为了实现降序排序,简单地用大于号重载了小于号。    2.设计实现过程 代码主要分为三个部分: 1

第四次作业——结对编程

╄→尐↘猪︶ㄣ 提交于 2019-12-01 05:35:23
软件工程第三次作业:原型设计 这个作业属于哪个课程 <18级软件工程基础> 学生姓名 | 姚志昆 学号 | 201831081105 合作伙伴 | 吴昊阳 GitHub地址 | <第四次作业——结对编程克隆地址> 这个作业的要求在哪里 | <个人第4次作业:结对编程> 这个作业的目标的目标| 熟悉Github提交代码等基本操作,对词频统计应用的代码实现。 一、解题思路描述 刚刚看到这道题的时候的第一感觉是复杂。 1.首先是在数据的传入,可以是直接open文件,也可以是在运行窗口输入。 2.在创立一个单词的时候,他有两方面的信息,一是 个数 ,二是 单词内容 ,因此可以 用结构体来存储其信息 。 3.再者,由于单词的长度是不固定的,因此我们可以用vector动态数组对象a的方式来将单词的内容存入其中; 4.每次如果单词相同,则会将num加一,如过没有出现过,则会创建一个结构体,分别将他的单词内容和个数初始化,再将单词内容存储 vector数组对象a 中。 5.对于非英文字符的处理,可以直接将其去掉,即 比较其ASC码 ,如果不属于‘a’<'char'<‘z’或者‘A’<'char'<‘Z’,则会将这个符号去除。 6.由于在要求中有“file123是一个单词,123file不是一个单词。file,File和FILE是同一个单词”的要求,因此处理方法可以是 将所有的单词存储成同样的大小写

数文本串中的单词数

我怕爱的太早我们不能终老 提交于 2019-12-01 05:33:04
1 int Count_word(char *s){ 2 int state; 3 if(s[0]==' ') state=0; 4 else state=1; 5 int ans=0; 6 for(int i=1;s[i];i++){ 7 if(s[i]==' ') { 8 if(state==1){ 9 ans++; 10 state=0; 11 } 12 } 13 else { 14 if(state==0){ 15 state=1; 16 } 17 } 18 } 19 if(state==1) ans++; 20 return ans; 21 } 来源: https://www.cnblogs.com/TYXmax/p/11660288.html

山羊拉丁文

大城市里の小女人 提交于 2019-12-01 05:31:41
/** *山羊拉丁文的规则如下: * *如果单词以元音开头(a, e, i, o, u),在单词后添加"ma"。 *例如,单词"apple"变为"applema"。 * *如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"。 *例如,单词"goat"变为"oatgma"。 * *根据单词在句子中的索引,在单词最后添加与索引相同数量的字母'a',索引从1开始。 *例如,在第一个单词后添加"a",在第二个单词后添加"aa",以此类推。 *返回将 S 转换为山羊拉丁文后的句子 */ function toGoatLatin($S) { $sarr = explode(' ',$S); $index = 0; $aeiou = ['a','e','i','o','u']; for($i=0;$i < count($sarr); $i++){ if(in_array(strtolower($sarr[$i]{0}),$aeiou)){ $sarr[$i] .= 'ma'.str_repeat('a',$i+1); }else{ $sarr[$i] = substr($sarr[$i],1).$sarr[$i]{0}.'ma'.str_repeat('a',$i+1); } } return implode(" ",$sarr); } /**

词法分析程序的设计与实现

血红的双手。 提交于 2019-12-01 05:04:35
词法分析程序( Lexical Analyzer )要求: - 从左至右扫描构成源程序的字符流 - 识别出有词法意义的单词( Lexemes ) - 返回单词记录(单词类别,单词本身) - 滤掉空格 - 跳过注释 - 发现词法错误 程序结构: 输入:字符流(什么输入方式,什么数据结构保存) 处理: –遍历(什么遍历方式) –词法规则 输出:单词流(什么输出形式) –二元组 单词类别: 1.标识符(10) 2.无符号数(11) 3.保留字(一词一码) 4.运算符(一词一码) 5.界符(一词一码) 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)* 10 >= 24 dd* 11 = 25 + 13 ; 26 - 14 ( 27 * 15 ) 28 / 16 # 0 程序代码如下: #include<stdio.h> #include<string.h> #include<stdlib.h> char prog[800],token[8];//程序段,单词符号 char ch,error; int syn,p,m,n,sum;//单词符号类型syn,整数sum,p当前要识别程序段第一个字符指针p char *word[6]={"begin",