lightoj 1293 - Document Analyzer [ 两指针 + 字符串 ]
| Time Limit: 3 second(s) | Memory Limit: 32 MB |
You work in a leading software development company. As you are great in coding, most of the critical tasks are allotted for you. You like the challenge and you feel excited to solve those problems.
Recently your company is developing a project named Document Analyzer. In this project you are assigned a task; of course a critical task. The task is that you are given a document consisting of lowercase letters, numbers and punctuations. You have to analyze the document and separate the words first. Words are consecutive sequences of lower case letters. After listing the words, in the order same as they occurred in the document, you have to number them from 1, 2, ..., n. After that you have to find the range p and q (p ≤ q) such that all kinds of words occur between p and q (inclusive). If there are multiple such solutions you have to find the one where the difference of p and q is smallest. If still there is a tie, then find the solution where p is smallest.
Input
Input starts with an integer T (≤ 15), denoting the number of test cases.
Each case will be denoted by one or more lines denoting a document. Each line contains no more than 100 characters. A document will contain either lowercase letters or numbers or punctuations. The last line of a document will contain the word 'END' which is of course not the part of the document. You can assume that a document will contain between 1 and 50000 words (inclusive). Words may contain up to 10 characters. And a document can contain up to 5000 lines.
Output
For each case, print the case number and p and q as described above.
Sample Input |
Output for Sample Input |
|
3 1. a case is a case, 2. case is not a case~ END a b c d e END a@#$a^%a a a b b----b b++12b END |
Case 1: 6 9 Case 2: 1 5 Case 3: 5 6 |
Note
Dataset is huge, use faster I/O methods.
我也是醉了,输出少了个空格wa惨了,,,
题解:如标签,用两个指针start、end,往前扫,复杂度O(n)
| 484217 | 2015-03-14 08:05:52 | 1293 - Document Analyzer | C++ | 1.128 | 6928 |
Accepted
|
|---|
#include <cstdio>
#include <cstring>
#include <stack>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <string> #define ll long long
int const N = ;
int const M = ;
int const inf = ;
ll const mod = ; using namespace std; int cnt,T;
char s[];
map<string,int>mp;
int a[N];
int len;
int tot;
int vis[N];
int p,q;
int l;
char temp[N]; void ini()
{
p=-;q=;
int i,j;
mp.clear();
len=tot=;
memset(vis,,sizeof(vis));
while(scanf("%s",s)!=EOF && strcmp(s,"END")!=){
l=strlen(s);
// printf(" %s\n",s);
j=;
int ff=;
for(i=;i<l;i++){
if(s[i]>='a' && s[i]<='z'){
ff=;
temp[j]=s[i];
j++;
}
else{
if(ff==){
temp[j]='\0';
len++;
j=;
ff=;
if(!mp[temp]){
tot++;
mp[temp]=tot;
}
a[len]=mp[temp];
}
}
} if(ff==){
temp[j]='\0';
len++;
j=;
ff=;
if(mp[temp]==){
tot++;
mp[temp]=tot;
}
a[len]=mp[temp];
}
}
//printf(" len=%d tot=%d\n",len,tot);
//for(i=1;i<=len;i++){
// printf(" i=%d a=%d\n",i,a[i]);
//}
} void solve()
{
int i,j;
int now=;
i=;
j=;
while(i<=len)
{
//printf(" i=%d j=%d\n",i,j);
for(;j<=len;j++){
vis[ a[j] ]++;
if(vis[ a[j] ]==) now++;
if(now==tot){
//printf(" i=%d j=%d p=%d q=%d\n",i,j,p,q);
for(;i<=j;i++){
if(vis[ a[i] ]==){
//printf(" i=%d j=%d p=%d q=%d\n",i,j,p,q);
if(j-i<q-p){
p=i;q=j;
}
else if(j-i==q-p){
if(i<p){
p=i;q=j;
}
}
vis[ a[i] ]--;
now--;i++;j++;
break;
}
vis[ a[i] ]--;
}
break;
}
}
if(j==len+) break;
}
} void out()
{
printf("Case %d: %d %d\n",cnt,p,q);
} int main()
{
//freopen("data.in","r",stdin);
scanf("%d",&T);
for(cnt=;cnt<=T;cnt++)
//while(scanf("%d%d",&n,&m)!=EOF)
{
ini();
solve();
out();
}
}
lightoj 1293 - Document Analyzer [ 两指针 + 字符串 ]的更多相关文章
- ytu 1052: 写一函数,将两个字符串连接(水题,指针练习)
1052: 写一函数,将两个字符串连接 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 343 Solved: 210[Submit][Status][ ...
- java中判断两个字符串是否相等的问题
我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...
- c语言中的利用函数实现交换两个字符,交换两个字符串
c语言交换两个字符: 方法一:利用指针传址,效率比较高 void swap(int *a,int *b) { int temp; temp = *a; *a = *b; *b = temp } 方法二 ...
- 【python】实例-python实现两个字符串中最大的公共子串
由于python中的for循环不像C++这么灵活,因此该用枚举法实现该算法: C="abcdefhe" D="cdefghe" m=0 n=len(C) E=[ ...
- shell比较两个字符串是否相等
比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then这里的关键有几点:1 使用单个等号2 注意到等号两边各有一个空格 ...
- js正则表达式的一些研究,截取两个字符串中间的字符串
一个最常用的场景 截取两个字符串中间的字符串 var str = "iid0000ffr"; var substr = str.match(/id(\S*)ff/); ...
- C#动态规划查找两个字符串最大子串
//动态规划查找两个字符串最大子串 public static string lcs(string word1, string word2) { ...
- Python 比较两个字符串大小
python 2中,有cmp(a,b)函数,用于比较两个字符串的大小. 如 >>>a='abc' >>>b='abd' >>>print cmp( ...
- 用Java编程找到两个字符串中共有的字符
这道题的算法思想是把字符串1中的每个字符与字符串2中的每个字符进行比较,遇到共同拥有的字符,放入另一个数组中,最后顺序输出即可 但是这道题的难点在于怎么排除重复的字符 public class bot ...
随机推荐
- tar.bz2
tar -xvjf gcc-4.1.0.tar.bz2 bzip2 -d gcc-4.1.0.tar.bz2
- 字符串循环右移-c语言
一个长度为len的字符串,对其循环右移n位 [期望]char str[] = "abcdefg";右移3次后,变成"efgabcd" [思路] 思路1. 如果用 ...
- 洛谷P1724 东风谷早苗
题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重).早苗的 ...
- Netbeans调试教程
官方教程:Netbeans调试 CC++ 项目教程.docx 1.步过: 就是把函数当成一条指令来调用 比如上面就是光执行fun(i),不会到函数里面去 2.步入 就是进入函数里面执行 3.步出 就是 ...
- function语句注意事项
function语句 在Javascript中定义一个函数,有两种写法: function foo() { } 和 var foo = function () { } 两种写法完全等价.但是在解析的时 ...
- 关于Java的三种普通排序
首先要知道是哪几种排序 这里我们所说的是 冒泡排序,选择排序以及插入排序 然后要理解大概的排序速度 : 插入<选择<冒泡 下面是代码 大家可以拷贝自己在java环境里运行运行! publi ...
- 雷林鹏分享:Lua 数据类型
Lua是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储在变量中,作为参数传递或结果返回. Lua中有8个基本类型分别为:nil.boolean.number.string.userda ...
- SQL Server连接不上本地服务器
昨天星期一,到公司,如常打开电脑后,上个厕所,吃个早餐,电脑才完全醒来.打开项目后台,发现登不上,用户名或密码错误,认真输入几遍,还是错误,打开本地数据库,sql server连接不上,提示错误: 我 ...
- svn搭建脚本
1.yum install subversion 2.输入rpm -ql subversion查看安装位置 我们知道svn在bin目录下生成了几个二进制文件. 输入 svn --help可以查看svn ...
- tiny4412学习笔记-将uboot、zImage、文件系统烧到emmc中 (转)
http://blog.chinaunix.net/uid-30025978-id-4788683.html 1.首先还是要将u-boot写入SD卡中从SD卡启动. 使用读卡器将SD插入电脑中,使用u ...