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 ...
随机推荐
- SQL中的笛卡儿积问题和多表连接操作
(使用scott用户) SELECT * FROM scott.dept;--4SELECT * FROM scott.emp;--14 /**笛卡尔积内连接(等值连接)外连接(非等值连接)自连接*/ ...
- Kotlin学习的一些心得
1.工程manifest中的application节点有冲突时,添加 xmlns:tools="http://schemas.android.com/tools" tools:re ...
- C# 调用第三方DLL缓冲区溢出导致的异常
这个倒是少见的错误,纪录一下大佬. 先上异常 错误一:尝试读取或写入受保护的内存 错误二:未将对象引用设置到对象的实例 错误三: 托管调试助手“FatalExecutionEngineError”( ...
- iptables规则的关系
iptables规则的关系,是自上而下进行过虑的.所以添加规则时,要通过文件进行添加,这样的话,可以控制其顺序. A机器: [root@www ~]# netstat -an | grep 6100 ...
- Django展示第一个网页
展示一个网页需要三部分组成: urls.py -- 指定网址与对应的视图 views.py -- 创建试图以及指定对应的模板 template/*.html -- 对应的模板 一.urls.py ur ...
- CSS 功能简介
CSS的功能主要包括节点管理(Node Management,以下简称NM)和组管理(Group Management,以下简称GM)两部分,都是由守护进程ocssd.bin 来实现的,这是个多线程的 ...
- 【整理】treeGrid 树形表格
treeGrid 树形表格 https://fly.layui.com/extend/treeGrid/
- es6 fs 输出文件 iviewDemo
// fs.open('./env.js', 'w', function(err, fd) { // // const buf = 'export default "development& ...
- #PHP#微信支付 第二篇 JSAPI 调用统一下单接口获取预支付交易数据
上一篇讲到成功获取 openid,本篇要调用微信统一接口创建预支付交易单,并获取到相关数据,以便(后边)在微信内调起H5支付 第三步,调用微信统一下单接口创建预支付交易单 微信统一下单API是微信支付 ...
- CAD交互绘制直线(网页版)
用户可以在CAD控件视区任意位置绘制直线. 主要用到函数说明: _DMxDrawX::DrawLine 绘制一个直线.详细说明如下: 参数 说明 DOUBLE dX1 直线的开始点x坐标 DOUBLE ...